今日は2025年3月30日。
処理の中で前の月を取得したいと思い下記のコードを実装した。
Carbon::now()->subMonth()
で、うまく取得できているか確認しようと思いデバックしたところ、下記の表示が出た。
2025-03-02 09:43:23
あれ、おかしい。
自分が取得したいのは2月の日付である。
その後、何回実行しても3月の日付が取得されてしまう。。。
ここで少し詰まった。
確実に前の月の値を取得したいならfirstOfMonth()を使おう
どうやらsubMonth()の仕様だと1ヶ月前の日付を取得する為、例えば3月30日に実行すると2月30日が存在しないため3月に調整されることが発生する仕様とのこと。
なので、確実に前の月を取得するにはfirstOfMonth()メソッドを使ってその月の初日が始まった日付を取得することで、確実に前の月を取得するようにした方がよさそう。
// 修正コード
$lastMonthDate = Carbon::now()->firstOfMonth()->subMonth();
$year = $lastMonthDate->year;
$month = $lastMonthDate->month;
// ログで出した結果
[2025-03-30 09:37:32] local.DEBUG: 2025-02-01 00:00:00
[2025-03-30 09:37:32] local.DEBUG: 2025
[2025-03-30 09:37:32] local.DEBUG: 2