PHP日期间隔 - 错误的月份差异

时间:2013-10-31 22:58:56

标签: php

看一下这段代码:

  $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.

谢谢!

1 个答案:

答案 0 :(得分:8)

PHP DateTime无法处理不完整的日期时间。

DateTime::createFromFormat('Y-m', '2011-07')提供一个DateTime,其中包含2011年,7个月,以及从当前时间获取的日,时,分和秒(at我写这篇文章的那一刻,2011-07-31 18:05:47

同样地,DateTime::createFromFormat('Y-m', '1998-06')给出一个DateTime,其中有一年的1998年,一个月的6,以及从​​当前时间开始的一天,一小时,一分钟和一秒。由于6月31日是一个不存在的日期,结果是1998-07-01 18:05:47(在6月1日之前的31天之后)。

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

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

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