事象
10月31日にdate -d “last month” を実行した結果。
10月から見たlast month (つまり先月)は9月だから9月出力されると期待するが、
2023年 10月 1日 日曜日 09:08:35 JST
10月1日になっちゃうんだなぁ。
原因
dateの
last month
オプションって、
30日で引き算してるだけなのか?
10/31の一ヶ月前で9/31を取得するが9月は30日までの為、+1日して10/1という結果になった
つうことみたい(R)
ちなみに、
翌月のdate -d “next month” +”%m”でも同じ事象が起こる
10月31日の翌月を取得しようとして、
date -d "next month" +"%m"
すると、
11月31日が存在しないため、
12月
が出力される。
対策
- 今月を数値として取得して、引き算する
- 31日対策として最初に1日引き算してからlast Month取得する
- いやこれは3月にやると同じ事象が発生してしまうからNGか
- やるなら10日ぐらい引き算したほうが確実
- 今月の1日を起点として last Month 取得する
色々とあると思うが、上記のQiitaリンクでご紹介いただいてる今月の1日を起点とする方法がいっちゃんかっこいいかな。
#!/bin/bash
# 今月の月を取得(31日の場合などだと後述の計算時に不具合が起こるので今月の1日で取得)
first_day_of_month=$(date +'%Y-%m-01')
# 先々月
previous_previous_month=$(date -d "$first_day_of_month -2 months" +"%m")
# 先月
previous_month=$(date -d "$first_day_of_month -1 month" +"%m")
# 今月(これは普通に今日でいい)
current_month=$(date +'%m')
# 来月
next_month=$(date -d "$first_day_of_month +1 month" +"%m")
コメント