为什么在2到3个月之间,Unix的date有所不同

这怎么可能,我该如何处理呢? 我正在做依赖于Unix date备份脚本,并发现了一个有趣的bug:

 [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 

由于夏令时(夏令时),您会看到此行为。

因为你现在正在夏天,你的时钟在前面一个小时,当你在三个月前,在六月一号的午夜之后问的时候,时间最早是一个小时,因为它不是三个夏天几个月前。

GNUdate文档build议在分别询问相对date或月份时,以中午12点和本月15号为出发点来解决此问题 。 例如:

 date +%y-%m-%d --date="$(date +%Y-%m-15) -3 month" 

如果绝对时机是您主要关心的问题,那么可能最好采用UTC,因为它就是为了这个目的而存在的。 迈克尔的回答对于当你必须解决问题时非常有用,但是通常是一个好主意,可以尽可能地避免它。

如果系统默认未设置为UTC,则传递时区的最简单方法是将您的命令与TZ环境variablesTZ 。 这将区域开关限制为单个命令,并使variables不会泄漏到后续命令中。

 $ NOW=$(date '+%s') $ date -d @$NOW Wed Jun 11 23:44:35 EDT 2014 $ TZ=UTC date -d @$NOW Thu Jun 12 03:44:35 UTC 2014 

不应该做的是导出TZvariables,因为这可能使事情变得非常混乱,如下所示。

 $ export TZ=UTC $ date -d @$NOW Thu Jun 12 03:44:35 UTC 2014 $ TZ=EDT date -d @$NOW Thu Jun 12 03:44:35 EDT 2014 

在你计算机认为正在运行的特定年份,以及在你select“1个月前,2个月前和3个月前的testing”的具体date,是的 – 这可能是2月29日的检测。一个错误,但..

现在,今天不是2014-06-01。 再试一次。 将计算机date设置为2013-06-01。 再试一次。
将计算机date设置为2014-09-01。 再试一次。