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