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

为什么这两个日期命令给出不同的结果?
$ date -d "Apr 1 2016 - 1 month" +%B

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

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

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

答案1

打开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从而为如何确定要显示的日期/时间提供了更多余地。

相关内容