【PHP】月の加減算には要注意

例えば一月後の年月が欲しい場合、下記のコードを書くと、実行日によって正しい結果が得られません。

echo (new DateTime())->modify('+1 month')->format('Y-m');

// 2023-05-30 に実行した場合は 2023-06
// 2023-05-31 に実行した場合は 2023-07

月の日付が足りないと、翌月にオーバーフローします。 2023-05-31 の月に 1 を加算すると 2023-06-31 ですが、6 月は 30 日までのため 2023-07-01 となります。

echo (new DateTime('2023-05-30'))->modify('+1 month')->format('Y-m-d');  // 2023-06-30
echo (new DateTime('2023-05-31'))->modify('+1 month')->format('Y-m-d');  // 2023-07-01

正しい例

初日に修正して月を加算すると期待した値が得られます。

echo (new DateTime('2023-05-31'))->modify('first day of +1 month')->format('Y-m-d');  // 2023-06-01
echo (new DateTime('2023-05-31'))->modify('first day of next month')->format('Y-m-d');  // 2023-06-01

modify() に指定している文字列については、下記の PHP ドキュメントに記載されています。