はじめに
Carbon使用する時に気をつけたいと思ったのでメモです。
SubMonthsメソッド
- 1ヶ月前を取得を検索するとだいたい
subMonth()
メソッドが結果としてよく出ているが、月末になると日付がずれてしまうので注意が必要。
$date = new Carbon('20241031')->subMonth(1);
echo($date);
- 結果は
2024-10-01 00:00:00
になり、期待している2024-09-30 00:00:00
にはならない。CarbonはDateTimeのラッパーとして、存在しない日付に対して適切に調整してくれるらしい。この場合は9月31日は存在しないので、10月1日に調整してくれているみたい。
subMonthsNoOverflowメソッド
- 上記のようにならないために
subMonthsNoOverflow
を使用すると良いみたい。
$date = new Carbon('2024-10-31')->subMonthsNoOverflow(1);
echo $date;
- 期待通り
2024-09-30 00:00:00
が表示される。
addMonthメソッド
- 1ヶ月後も同様になる。11月31日は存在しないので
2024-12-01 00:00:00
になる。
addMonthsNoOverflowメソッド
- 期待通り
2024-11-30 00:00:00
が表示される。
まとめ
月末・閏年など、このあたりテストの観点として抜けがちだったので、注意しようと改めて思いました。