ホームページ > バックエンド開発 > PHPチュートリアル > PHP の DateTime::modify(' 1 month') が予期しない結果を生成するのはなぜですか?

PHP の DateTime::modify(' 1 month') が予期しない結果を生成するのはなぜですか?

Barbara Streisand
リリース: 2024-12-08 15:03:10
オリジナル
212 人が閲覧しました

Why Does PHP's DateTime::modify(' 1 month') Produce Unexpected Results?

PHP DateTime を使用した月の変更: 意図された動作を明らかにする

PHP の DateTime クラスを操作する場合、月を加算または減算しても、常に結果が得られるとは限りません。期待される結果。ドキュメントで注意されているように、これらの操作は見た目ほど直感的ではないため、「注意してください」。

意図された動作の説明

に示されている例を考えてみましょう。ドキュメント:

$date = new DateTime('2000-12-31');
$date->modify('+1 month'); // Move ahead by 1 month
echo $date->format('Y-m-d') . "\n"; // Prints 2001-01-31

$date->modify('+1 month'); // Advance another month
echo $date->format('Y-m-d') . "\n"; // Prints 2001-03-03
ログイン後にコピー

期待どおりに月が増加するのではなく、結果がジャンプします3月3日まで。これはなぜですか?

内部的には次のようなことが起こります:

  1. 1 か月を追加すると月番号が 1 増え、2001 年 12 月 31 日になります。
  2. ただし、12 月はは 31 日しかなく、1 月には 31 日はありません。
  3. その結果、PHP は日付を翌日 (たまたま 2 月 1 日) に自動的に調整します。
  4. 2001 年には 2 月は 28 日しかないため、別の月を追加すると 3 月 3 日になります。

期待された動作の取得

期待された動作を達成するには「 1 か月」で日付を丸 1 か月進める場合、いくつかのオプションがあります:

  1. 手動計算: 次の月の日数を手動で確認します。それに応じて日付を調整します。
  2. PHP 5.3 回避策: 「次の最初の日」を使用します。 month" スタンザを使用して、翌月の 1 日に直接移動します。例:
$d = new DateTime('2010-01-31');
$d->modify('first day of next month');
echo $d->format('F'), "\n"; // Correctly prints February
ログイン後にコピー

結論

予期しない結果を回避するには、DateTime の月変更操作の意図された動作を理解することが重要です。手動計算または「翌月の初日」機能を使用すると、PHP アプリケーションで目的の日付操作機能を実現できます。

以上がPHP の DateTime::modify(' 1 month') が予期しない結果を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート