web-dev-qa-db-ja.com

GNU日付エポック+%s vs.現在のタイムスタンプフレーズで月を含む計算?

タイムスタンプ句を含むgnudateを使用してシェルスクリプトで日付計算を実行しようとしていますが、これらの違いを説明できません。誰かが私を啓発できますか?これはバグですか?

% date -u -d "now"
Fri Aug  2 15:07:16 UTC 2013

% date -u -d "1970-01-01 00:00:00 UTC  + `date +%s` seconds"
Fri Aug  2 15:07:29 UTC 2013

% date -u -d "now -6 months -1 day"
Fri Feb  1 15:07:52 UTC 2013

% date -u -d "1970-01-01 00:00:00 UTC  + `date +%s` seconds -6 months -1 day"
Tue Jan 29 15:08:03 UTC 2013

%sはマンページで「1970-01-01 00:00:00 UTCからの秒数」と定義されているため、最後のものは前のものとまったく同じ意味であると予想しました。

1
hkhl

演算の優先順位エラーのようです。このコマンドを実行すると、正常に機能します。

_$ date -u -d "$(date -u -d "1970-01-01 00:00:00 UTC  + `date +%s` seconds") \
     -6 months -1 day"
_

これを実行すると、奇妙な結果が得られます。

_$ date -u -d "$(date +%s) seconds -6 months -1 day"
Sun Sep  3 07:48:54 UTC 2056
_

しかし、$(date +%s) secondsを親で保護すると、問題が解決するようです。

_$ date -u -d "($(date +%s) seconds) -6 months -1 day"
Fri Feb  1 15:55:12 UTC 2013
_
1
slm