PHP7.3時点ではDateTimeImmutable一択。 DateTimeImmutable 日付操作で問題になるのは『31日の一ヶ月後』の定義です。 その定義さえしっかりしておけば、どの手段を使おうが正しい結果を得ることはできます。 プログラマ的には「10月31日の一ヶ月後」は「12月1日」ですが、一般人に「10月31日の一ヶ月後は?」と聞いたら「11月30日」って返ってくると思うので、以下は11月30日であるという前提で話を進めます。 $dt = \DateTimeImmutable::createFromFormat('Y-m-d', '2018-10-31'); // 月初 echo $dt->modify('first day of next month')->format('Y-m-d'); // 2018-11-01 echo $dt->modify('first day