这怎么可能,我该如何处理?我正在制作依赖于 Unix 的备份脚本,date
并发现了一个有趣的错误:
[root@web000c zfs_test]# date +%y-%m-%d --date='2 months ago'
14-04-01
[root@web000c zfs_test]# date +%y-%m-%d --date='3 months ago'
14-02-28
[root@web000c zfs_test]# date
Sun Jun 1 00:08:50 CEST 2014
由于夏令时(夏令时),您会看到这种行为。
因为您目前处于夏令时,您的时钟提前一小时,当您在 6 月 1 日午夜刚过时要求三个月前,时间最终“提前”一小时,因为它不是夏令时三几个月前。
GNU 日期文档建议在分别询问相对日期或月份时,使用中午 12:00 和每月 15 日作为起点来解决此问题。例如:
如果绝对时间是您最关心的问题,那么最好使用UTC,因为它为此目的而存在。当您必须解决问题时,迈克尔的回答非常有用,但通常最好在可能的情况下完全避免它。
当您的系统默认未设置为 UTC 时,传递时区的最简单方法是在命令前加上
TZ
环境变量。这将区域切换限制为单个命令,并防止变量泄漏到您的后续命令中。您不应该做的是导出
TZ
变量,因为这会使故障排除变得非常混乱,如下所示。在您的计算机认为正在运行的特定年份,以及您为“1 个月前、2 个月前和 3 个月前的测试选择的特定日期,是的 - 这可能是 2 月 29 日的检测。并非总是如此一个错误,但是..
现在,今天不是 2014-06-01。再试一次。将计算机日期设置为 2013-06-01。再试一次。
将计算机日期设置为 2014-09-01。再试一次。