BLOGTIMES
2020/12/27

date -d "1 month 1 day ago" とやると危ない!

  linux  cli 
このエントリーをはてなブックマークに追加

date コマンドは -d オプションを使うと、たとえば今から 30 日前のような相対的な日付を簡単に得ることができます。
これについては常識みたいなものですが、今更ながら思わぬハマりポイントを見つけてしまったのでメモ。

$ date --iso-8601=seconds 2020-12-27T16:28:55+09:00 $ date -d '1 month ago' --iso-8601=seconds 2020-11-27T16:28:55+09:00

まず ago の挙動について、coreutils のマニュアルを確認すると、-1 を掛ける(符号を反転させる)という意味だということが分かります。
問題は、実はこの効力が unit ごとであるということです。

つまり1ヶ月と1日前という場合にうっかり -d "1 month 1 day ago" と書いてしまうと、1ヶ月後の1日前になってしまうことになります
複数の単位を組み合わせる場合には ago は使わずに符号を書いた方が誤解がないですね。

$ date --iso-8601=seconds 2020-12-27T16:28:55+09:00 $ date -d "1 month 1 day ago" --iso-8601=seconds 2021-01-26T16:28:56+09:00 $ date -d "1 month ago 1 day ago" --iso-8601=seconds 2020-11-26T16:28:56+09:00 $ date -d "-1 month -1 day" --iso-8601=seconds 2020-11-26T16:28:56+09:00

参考

Relative items in date strings (GNU Coreutils)

Following a relative item by the string ‘ago’ is equivalent to preceding the unit by a multiplier with value -1.


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/12195
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン