为什么Unix日期在2到3个月之间有差异


16

这怎么可能?我该如何处理?我正在制作依赖于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

可能是a年/ 2月29日的错误吗?不太可能使用类似的工具date...
Mark Henderson

Answers:


44

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

因为您当前处于夏令时,所以您的时钟要提前一个小时,所以当您在三个月前的6月1日午夜之后询问时,时间最终比“夏令时”早了一个小时,因为这不是夏令时三几个月前。

GNU日期文档建议通过分别询问相对日期或月份时,以正午12:00和每月15日为起点来解决此问题。例如:

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

谢谢。是的,恰好是“ 3个月前”,将在01 am之前出现:[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
Shirker 2014年

h!我认为我需要仔细阅读一些脚本,因为我怀疑我已经忽略了有关date用法的建议。
Caleb 2014年

14

如果绝对时间是您的主要考虑因素,那么最好是出于这种目的而使用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

-3

在您认为计算机正在运行的特定年份,以及您选择的测试日期为“ 1个月前,2个月前和3个月前,是的-可能是2月29日检测到。一个错误,但是..

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


6
如果您以美国MDY格式提供日期,请使用/es分隔。更好的是,因为我们在这里是一个国际社区,所以请使用适当的ISO日期,例如2014-09-01
glglgl 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.