date コマンドの引数に month がありますが、特に気をつけなければならないことについて、気がついたので、それを記録してみました。
1.具体例
今日は10月31日です。
だから$ date を実行すると 以下のように表示される。
Wed Oct 31 16:23:32 JST 2018
ところが、翌月、前月などの表示をさせようとすると以下の結果になった。
date +%m -d “1 month”
12 ← 翌月だから11月のはずなのに。$ date +%m -d “-1 month”
10 ← 前月だから9月のはずなのに$ date +%m -d “-2 month”
08 ← 前々月だから8月で正当$ date +%m -d “2 month”
12 ← 翌々月だから12月で正当
9月と11月が無くなったのです。
月だけの表示だからというわけでもないようです。
$ date -d “1 month”
Sat Dec 1 17:22:23 JST 2018 ← やっぱり翌月は12月です。
日にちの表示はこんなこと起きていません。
$ date +%d -d “1 day”
01 ← 翌日だから1日で正当$ date +%d -d “-1 day”
30 ← 前日だから30日で正当$ date +%d -d “0 day”
31 ← 当日だから31日で正当
2.解決策
これについて https://shellscript.sunone.me/date.htmlでは、3月31日の1ヶ月前を例に、以下のように説明されている。
2011年3月31日の
1 months ago
は2011年2月31日となるが、2月31日は存在しないため2011年2月28日にあふれた3日分を加算した日付が、コマンドの実行結果となる。冷静に考えれば当然のことだが、1 months ago
に目を取られてこのことを見逃しがちなので注意が必要だ。正確に先月の月を取得するには、当月の1日から1ヶ月前の日付を求めればよい。
なるほど
コメント