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')给出 aDateTime的年份为 2011,月份为 7,日期、小时、分钟和秒取自当前时间(在我写这篇文章的那一刻,2011-07-31 18:05:47.

同样,DateTime::createFromFormat('Y-m', '1998-06')给出DateTime年份为 1998、月份为 6 以及取自当前时间的日、时、分和秒的 a。由于 6 月 31 日是不存在的日期,因此结果是1998-07-01 18:05:47(6 月 1 日前一天后的 31 天)。

这两个日期之间的差异是 3 年 0 个月和 30 天。

在您的 and 示例中2001-081998-07两个月恰好都有第 31 天,因此数学计算正确。这个错误很难确定,因为它取决于代码运行的日期,即使它看起来并不明显。

您可能可以通过使用格式"Y-m-d H:i:s"并附"-01 00:00:00"加到您传递到的每个日期来修复您的代码createFromFormat,这将锚定DateTime您回到月初。

于 2013-10-31T23:09:10.483 回答