dateコマンドで日付計算するときに、「1ヶ月前」「1日後」といった構文は便利なのでよく使うのだが、今回この「1ヶ月前」指定をなんとなく使っていて、まずい動きをすることがあったのでメモ。 どういうときにまずいかというと、「日付を比較する基準日が前月のカレンダー上にない場合」の挙動である。例えば、3月31日の前月は、2月31日ということになるが、この日付はカレンダー上存在しないため、結果はなんと3月3日になってしまう。(2月28日 + 3日という計算ロジックなのだろう。。) 具体的に実行結果を見てみる。 まず、普通に実行すると、以下のように正しく1ヶ月前を取得することができる。 $ date +'%Y-%m-%d' 2015-07-30 $ date -d '1 month ago' +'%Y-%m-%d' 2015-06-30次に、3月31日の1ヶ月前を取得してみる。 $ date -d