📑
PHP で翌月や前月の 1 日を求めるときの注意点
翌月や前月の 1 日を取得する場合、下記のようなコードでは期待する値を得られない場合があります。
// 期待通り
(new DateTime('2022-11-04'))->modify('+1 months')->format('Y-m-d'); // 2022-12-04
(new DateTime('2022-11-04'))->modify('-1 months')->format('Y-m-d'); // 2022-10-04
// 期待した値と違う
(new DateTime('2022-10-31'))->modify('+1 months')->format('Y-m-d'); // 2022-12-01
(new DateTime('2022-10-31'))->modify('-1 months')->format('Y-m-d'); // 2022-10-01
求めたい翌月や前月の日数が、起点となる月よりも少ない場合、翌々月や当月になってしまいます。
そのため、起点となる月の 1 日を求めてから加算や減算する必要があります。
(new DateTime((new DateTime('2022-10-31'))->format('Y/m/01')))->modify('+1 months')->format('Y-m-d'); // 2022-11-01
(new DateTime((new DateTime('2022-10-31'))->format('Y/m/01')))->modify('-1 months')->format('Y-m-d'); // 2022-09-01
Discussion