ShellScript
Linuxコマンド
日付処理

日付処理 を行うときの注意事項

日付処理を行うときの注意事項

dateコマンドを例としています。言語によって動作が変わりますが、深く考えず組んでしまうとバグの要因になるので、日付周りはきちんとチェックしましょう という意味を込めて

「前月の月」を取得する時の罠

例えば「5月31日」に前月の月を取得すると「5月」となってしまう問題。

$ date +%m -d "20180531 1 month ago"
05

先に解決策を言ってしまうと、「当月01日」に日付を変換してから1ヶ月前を取得するとよい。

では、なぜこのようになってしまうのか
それは「1ヶ月前 は何日前か?」 を考えると分りやすい。

例えば..
3月1日の1ヶ月前は、2月1日。この場合は28日前(閏年なら29日)
5月1日の1ヶ月前は、4月1日。この場合は30日前

つまり、当日から前月の日数を引いた日が1ヶ月前となる。

では、最初の例で言うと

5月30日の1ヶ月前は、4月30日
5月31日の1ヶ月前は、5月01日

となる。

3月でいうと、
3月28日の1ヶ月前は、2月28日
3月29日の1ヶ月前は、3月01日
3月30日の1ヶ月前は、3月02日
3月31日の1ヶ月前は、3月03日
※閏年以外

先週の特定曜日を取得する時の罠

例えば「月曜日の00:00:00から日曜日の23:59:59までを週別データとする」という仕様が有った場合、基準日となる月曜日を 「date "last monday"」と安易に指定すると、当日が月曜日だった場合に、「date "last monday"」が示す月曜日が、当日ではなく先週の月曜日となってしまいバグとなる問題

解決作は、当週の曜日を取得し -7日する
date -d "mon 7 days ago" +%Y%m%d