为什么这两个日期命令给出不同的结果?


9
$ date -d "Apr 1 2016 - 1 month" +%B

给我“三月”,这很棒-在四月之前的月份是三月。但是,如果我这样做:

$ date -d "$(date -d "Apr 1 2016") - 1 month" +%B

它给了我“二月”。这导致我拥有一些更复杂的代码中的错误。为什么这两个命令显示不同的结果?


两者都给了我March
cuonglm '16

1
正如Thomas所解释的,这取决于您的时区。我的DST将于3月13日更改-您的DST可能没有更改,因此您可能不会在同一日期看到此行为,或者如果您没有DST更改,则可能根本看不到。
Tal

Answers:


11

您可以通过打开shell跟踪来查看问题:

+ date -d 'Apr 1 2016 - 1 month' +%B
March
++ date -d 'Apr 1 2016'
+ date -d 'Fri Apr  1 00:00:00 EDT 2016 - 1 month' +%B
February

当您使用内部date命令的输出时,它是在四月的开始,并且由于EST / EDT的变化,当减去一个月会导致中断:

+ date -d 'Fri Apr  1 00:00:00 EDT 2016 - 1 month'
Mon Feb 29 23:00:00 EST 2016

当然,您的结果会因您当地的时区设置而异。打开跟踪将显示时区(在我的情况下为EDT)。

结果不同的原因是,在后一种情况下,您已向提供了更多信息date,使其参数更具体,即一天中的特定时间。在第一部分中,没有指定,这date为如何确定显示的日期/时间提供了更多的空间。


我现在意识到这与夏令时有关(我的时间在这里:timeanddate.com/time/zone/canada/edmonton),但是我仍然不明白为什么date命令似乎以不同的方式解释相同的日期在子shell中比在主shell中。如果使用以下命令运行脚本date -d "Apr 1 2016"; date -d "$(date -d "Apr 1 2016")",我将得到完全相同的结果,包括相同的时区标记-为什么要从两个结果中减去一个月却得出不同的结果?
塔尔

哦-您的上一次编辑很清楚。谢谢
Tal
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.