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

Tal*_*Tal 9 date

$ date -d "Apr 1 2016 - 1 month" +%B
Run Code Online (Sandbox Code Playgroud)

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

$ date -d "$(date -d "Apr 1 2016") - 1 month" +%B
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*key 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
Run Code Online (Sandbox Code Playgroud)

当您使用内部date命令的输出时,它是在 4 月初,当减去一个月时,由于 EST/EDT 更改而遇到不连续性:

+ date -d 'Fri Apr  1 00:00:00 EDT 2016 - 1 month'
Mon Feb 29 23:00:00 EST 2016
Run Code Online (Sandbox Code Playgroud)

当然,您的结果会根据您当地的时区设置而有所不同。打开跟踪将显示时区(在我的情况下,EDT)。

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