📑

PHP で翌月や前月の 1 日を求めるときの注意点

2022/11/04に公開

翌月や前月の 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
GitHubで編集を提案

Discussion