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