4

このコードを見てください:

  $first = DateTime::createFromFormat('Y-m', '2001-07');
  $last = DateTime::createFromFormat('Y-m', '1998-06');
  $interval = $first->diff($last);
  echo "m diff: ".$interval->m." y diff: ".$interval->y."\n";

出力はm diff: 0 y diff: 3 です。

間違った月差が返されるのはなぜですか?

興味深いことに、日付を「2001-08」と「1998-07」に変更すると、正しい月間隔 ==1 が返されます。

ありがとう!

4

1 に答える 1

8

PHPDateTimeは不完全な日時を処理しません。

DateTime::createFromFormat('Y-m', '2011-07')年はDateTime2011 年、月は 7、現在時刻から取得した日、時、分、秒を含む aを返します (これを書いている時点では、2011-07-31 18:05:47.

同様に、年DateTime::createFromFormat('Y-m', '1998-06')DateTime1998 年、月が 6 であり、現在時刻から取られた日、時、分、および秒をもつ a を返します。6 月 31 日は存在しない日付なので、結果は1998-07-01 18:05:47(6 月 1 日の前日から 31 日後) になります。

この 2 つの日付の差は、3 年 0 か月 30 日です。

2001-08との例では1998-07、両方の月にたまたま 31 日があるため、計算は正しく行われます。このバグは、コードが実行された日付に依存するため、突き止めるのが難しいものです。

の形式を使用してに渡す各日付に"Y-m-d H:i:s"追加することで、おそらくコードを修正できます。これにより、月の初めに戻って固定されます。"-01 00:00:00"createFromFormatDateTime

于 2013-10-31T23:09:10.483 に答える