Answers:
由于夏季时间(夏令时),您会看到此行为。
因为您当前处于夏令时,所以您的时钟要提前一个小时,所以当您在三个月前的6月1日午夜之后询问时,时间最终比“夏令时”早了一个小时,因为这不是夏令时三几个月前。
GNU日期文档建议通过分别询问相对日期或月份时,以正午12:00和每月15日为起点来解决此问题。例如:
date +%y-%m-%d --date="$(date +%Y-%m-15) -3 month"
[root@web000c zfs_test]# date +%y-%m-%d --date='3 months ago'
14-03-01
[root@web000c zfs_test]# date
Sun Jun 1 01:00:15 CEST 2014
date
用法的建议。
如果绝对时间是您的主要考虑因素,那么最好是出于这种目的而使用UTC。当您必须解决问题时,Michael的答案非常有用,但是通常最好避免在可能的地方完全解决。
当系统默认未设置为UTC时,传递时区的最简单方法是在命令前加上TZ
环境变量。这将区域切换限制为单个命令,并防止变量泄漏到后续命令中。
$ 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
您不应该做的是导出TZ
变量,因为这会使故障排除变得非常混乱,如下所示。
$ 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
在您认为计算机正在运行的特定年份,以及您选择的测试日期为“ 1个月前,2个月前和3个月前,是的-可能是2月29日检测到。一个错误,但是..
现在,今天不是2014-06-01。再试一次。将计算机日期设置为2013-06-01。再试一次。
将计算机日期设置为2014-09-01。再试一次。
MDY
格式提供日期,请使用/
es分隔。更好的是,因为我们在这里是一个国际社区,所以请使用适当的ISO日期,例如2014-09-01
。
date
...