这怎么可能,我该如何处理呢? 我正在做依赖于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。 再试一次。