我想计算自Unix Epoch(1970-01-01 00:00:00)以来的秒数 . 通常我会用
date +"%s"
现在,在我的系统上, +"%s"
选项不可用,但我很容易使用其他一些'date'选项并使用bc解析它:
date -u +"scale=0;(((((%Y-1970)*365.2425+%j)*24+%H)*60+%M)*60+%S)/1" | bc
这是短暂的
years = year_now - 1970
days = years * 365.2425 + day_of_year_now
hours = days * 24 + hour_now
minutes = hours * 60 + minute_now
seconds = minutes * 60 + second_now
到现在为止还挺好 . 然后我发现这个计算的结果与 +"%s"
选项的结果不匹配 . 我需要添加一个幻数:
date -u +"scale=0;(((((%Y-1970)*365.2425+%j)*24+%H)*60+%M)*60+%S-36936)/1" | bc
为什么?
此外,几个月后,这个神奇的数字已经从 -36936
变为 -99792
.
为什么?
如果有人能够改正我的数学,我会感激不尽 . 也许某人有 date
的源代码,可以告诉我 +"%s"
的内部算法......?
2 回答
大多数系统都安装了perl:
这是一个POSIX方式,应该适用于所有Unix和Unix类系统:
如果您使用
ksh93
,这也应该有效: