これらの2つの日付コマンドが異なる結果をもたらすのはなぜですか?


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

「March」を教えてくれます。4月の前の月は3月です。しかし、これを行うと:

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

「2月」になります。これは私が持っているいくつかのより複雑なコードにバグを引き起こしています。これらの2つのコマンドが異なる結果を表示するのはなぜですか?


両方とも私にくれたMarch
cuonglm

1
Thomasが説明したように、これはタイムゾーンによって異なります。私のDSTは3月13日に変更されます-あなたのDSTはおそらく変更されないので、同じ日付でこの動作が見られない可能性があります。
Tal

回答:


11

シェルトレースをオンにすると、問題を確認できます。

+ 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

inner dateコマンドの出力を使用すると、4月の初めになり、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コマンドが同じ日付を異なるように解釈しているように見える理由を私はまだ理解していませんメインシェルよりもサブシェルで。次のようにスクリプトを実行するとdate -d "Apr 1 2016"; date -d "$(date -d "Apr 1 2016")"、同じタイムゾーンタグを含め、まったく同じ結果が得られます。両方から月を削除すると、結果が異なるのはなぜですか。
Tal

ああ、あなたの最後の編集はそれを明確にします。ありがとう
Tal
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.