9月と11月はどこに行った?date コマンドの不思議!

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ヶ月前の日付を求めればよい。

 なるほど

コメント

タイトルとURLをコピーしました