Linuxコマンド: date で◯か月前 / ◯か月後を取得するときの注意

date コマンドは、日付を取得したり、整形して表示したり、◯日後や◯か月後、◯年前の日付を表示したりすることができます。

◯か月前や◯か月後を使用する時が曲者で、月末に近い日に実行すると、思っていた動作をしてくれないことがあります。

$ date
2015年 9月  6日 日曜日 16:05:22 JST

$ date -d "2015-08-31"
2015年 8月 31日 月曜日 00:00:00 JST

$ date -d "2015-08-31 1 month"
2015年 10月  1日 木曜日 00:00:00 JST

$ date -d "2015-01-31 1 month"
2015年 3月  3日 火曜日 00:00:00 JST

8月31日の1か月後が10月1日になったり、1月31日の1か月後が3月3日になったりします。月によって◯か月後の計算をきちんとしてくれるわけではないようです。


実施日の翌月末を取得するには、実施月の 1日に変換してから、2ヶ月後の1日前を指定することで取得できます。

$ date -d "`date '+%Y/%m/01' -d "\`date '+%Y/%m/01' \` 2 month"` 1 day ago"
2015年 10月 31日 土曜日 00:00:00 JST

指定した日付の翌月の月末を取得する場合は、以下のように書きます。

$ date -d "`date '+%Y/%m/01' -d "\`date '+%Y/%m/01' -d 2015/08/31\` 2 month"` 1 day ago"
2015年 8月 31日 月曜日 00:00:00 JST

$ date -d "`date '+%Y/%m/01' -d "\`date '+%Y/%m/01' -d 2015/01/31\` 2 month"` 1 day ago"
2015年 2月 28日 土曜日 00:00:00 JST

指定した日付の前月の月末、前々月の月末は、以下のように書きます。0 month ago はなくてもいいです。

$ date -d "`date '+%Y/%m/01' -d "\`date '+%Y/%m/01' -d 2015/01/31\` 0 month ago"` 1 day ago"
2014年 12月 31日 水曜日 00:00:00 JST

$ date -d "`date '+%Y/%m/01' -d "\`date '+%Y/%m/01' -d 2015/01/31\` 1 month ago"` 1 day ago"
2014年 11月 30日 日曜日 00:00:00 JST



参考サイト

  1. date コマンド | hydroculのメモ

コメント

このブログの人気の投稿

日付フォーマットでない文字項目をSAS日付に変換するときにログ出力されるメッセージを抑制したい - SAS

データセット(.sas7bdatファイル)の文字コードを取得したい - SAS