对于我们的夜间构建系统,我编写了一个 C 程序来进行计算(使用本地专有库将日期存储为自参考日期以来的天数)。基本上,给定一个(不变的)参考日期,它会报告自参考日期以来的天数。因此,cron
脚本中将包含硬连线的第一天,并且程序将报告此后的天数。
该系统的最大优势是参考日期不会(经常)更改,因此脚本不会(经常)更改,并且没有外部文件可以存储信息。
可能有一些方法可以使用标准的 Unix 工具实现相同的效果,但我还没有坐下来制定出可移植的解决方案。我可能认为它是使用 Perl 的条款。(C 程序只能工作到公元 2999 年;我在代码中留了一个便条,让人们在它成为 Y3K 修复问题之前大约 50 年与我联系。这可能是微不足道的。)
您也许可以根据 Unix 时间戳工作...
创建一个脚本“days_since 1234567890”,将数字视为参考日期,获取当前时间戳(来自date
适当的格式规范;在 Linux 上,date '+%s'
可以完成这项工作,它也适用于 Mac OS X),获取差异并除以 86,400(一天中的秒数)。
refdate=1234567890
bc <<EOF
scale=0
($(date '+%s') - $refdate) / 86400
EOF
一个例子:
$ timestamp 1234567890
1234567890 = Fri Feb 13 15:31:30 2009
$ timestamp
1330027280 = Thu Feb 23 12:01:20 2012
$ refdate=1234567890
$ bc <<EOF
> scale=0
> ($(date '+%s') - $refdate) / 86400
> EOF
1104
$
因此,如果参考日期是 2009 年 2 月 13 日,那么今天是 1104 日。(程序bc
是计算器;它的名称与 Anno Domini 或 Before Christ 无关。该程序timestamp
是我的另一个自制程序,它根据格式打印时间戳可以指定;它是date
最初在date
具有功能之前编写的专用变体,我的意思是在 1980 年代初。)
在 Perl 单行中(假设您在脚本中指定了参考日期):
perl -e 'printf "%d\n", int((time - 1234567890)/ 86400)'
或者:
days=$(perl -e 'printf "%d\n", int((time - 1234567890)/ 86400)')