はじめに
PHP の DateTime クラスを使用する場合、月を追加すると、一見不可解な動作が発生します。開発者は単純に 1 ずつ増加することを期待するかもしれませんが、結果はこの期待から外れることがよくあります。この記事では、この動作の背後にあるロジックを調査し、それを修正するための解決策を検討します。
The Unintended Behavior: A Rationale
PHP ドキュメントに従って、月を加算または減算します。 DateTime は、必ずしもそれに対応して日付が変更されるわけではありません。次の例を考えてみましょう:
$date = new DateTime('2000-12-31'); $date->modify('+1 month'); echo $date->format('Y-m-d') . "\n"; // Outputs "2001-01-31"
日付は 1 月 31 日に進む代わりに、3 月 3 日にジャンプします。これは、2 月には 28 日 (閏年では 29 日) しかないため、PHP は次の月に収まるように日数を調整します。
予想される動作の解決策
月を追加すると日付が次の月の対応する日に移動するという期待どおりの動作を実現するには、手動での確認と修正が必要です。翌月の日数を決定し、現在の日付に追加する必要があります。
PHP 5.3 アプローチ (相対時間スタンザ)
PHP 5.3 以降の場合、相対時間スタンザは、より洗練されたソリューションを提供します。
$date = new DateTime('2010-01-31'); $date->modify('first day of next month'); echo $date->format('F') . "\n"; // Outputs "February"
このスタンザは次のことを組み合わせます。 next month and first day of は日付を翌月の 1 日に進め、期待どおりの動作を保証します。
以上がPHP の「DateTime::modify」で月を加算すると予期しない結果が生じるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。