- blogs:
- cles::blog
2020/12/27

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



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 を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . アーロンチェアのポスチャーフィットを修理(112258)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110903)
3 . 年次の人間ドックへ(110470)
4 . 2023 年分の確定申告完了!(1つめ)(110018)
5 . 三菱鉛筆がラミーを買収(109917)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110903)
3 . 年次の人間ドックへ(110470)
4 . 2023 年分の確定申告完了!(1つめ)(110018)
5 . 三菱鉛筆がラミーを買収(109917)
cles::blogについて
Referrers