当 '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"
我想计算自 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"