date -d “last month” や、”next month” コマンドは1ヶ月前じゃない場合がある | クズリーマンのカス備忘録

date -d “last month” や、”next month” コマンドは1ヶ月前じゃない場合がある

tux logo Linux
スポンサーリンク

事象

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")

コメント

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