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

これらの2つの日付コマンドが異なる結果を提供するのはなぜですか?
$ date -d "Apr 1 2016 - 1 month" +%B

「3月」と言ってください。いいですね。 4月の直前の月が3月です。しかし、これを行うと:

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

それは私に「2月」を与えた。これにより、より複雑なコードでエラーが発生しました。これらの2つのコマンドが異なる結果を表示するのはなぜですか?

答え1

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

+ 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

内部コマンドの出力を使用すると、date4月上旬になり、月を除くと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表示する日付/時刻を決定する方法にはさらに余地があります。

関連情報