计算自Unix日历以来的秒数,当'date'命令没有+“%s”选项时

时间:2016-03-08 16:58:21

标签: date unix epoch

我想计算自Unix Epoch(1970-01-01 00:00:00)以来的秒数。通常我会用

date +"%s"

现在,在我的系统上,+"%s"选项不可用,但我很容易使用其他'日期'选项并使用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 个答案:

答案 0 :(得分:0)

大多数系统都安装了perl:

perl -le 'print time'

答案 1 :(得分:0)

这是一种POSIX方式,应该适用于所有类Unix系统和Unix系统:

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

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

printf "%(%s)T\n"