当 'date' 命令没有 +"%s" 选项时计算自 Unix 纪元以来的秒数

Calculating seconds since the Unix Epoch when there is no +"%s" option for the 'date' command available

我想计算自 Unix 纪元 (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" 的内部算法 ... ?

大多数系统都会安装 perl:

perl -le 'print time'

这里是一个 POSIX 应该适用于所有 Unix 和类 Unix 系统的方法:

awk 'BEGIN {srand();print srand()}'

如果您使用 ksh93,这应该也有效:

printf "%(%s)T\n"