看看这段代码:
$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";
Run Code Online (Sandbox Code Playgroud)
输出为m diff:0 y diff:3
为什么它会返回错误的月份差异?
有趣的是,如果我将日期更改为"2001-08"和"1998-07",则会返回正确的月份间隔== 1.
谢谢!
PHP DateTime不处理不完整的日期时间.
DateTime::createFromFormat('Y-m', '2011-07')给出一个DateTime2011年,一个月7,以及从当前时间开始的一天,一小时,一分钟和一秒(在我写这篇文章时,2011-07-31 18:05:47.
同样地,DateTime::createFromFormat('Y-m', '1998-06')给出一个DateTime1998年的一年,一个月的6,以及从当前时间开始的一天,一小时,一分钟和一秒.由于6月31日是一个不存在的日期,结果是1998-07-01 18:05:47(在6月1日之前的31天之后).
这两个日期之间的差异是3年,0个月和30天.
在您的例子2001-08和1998-07,这两个月正好有31天,所以算算出来正确.这个bug很难确定,因为它取决于代码运行的日期,即使它看起来并不明显.
您可以通过使用格式"Y-m-d H:i:s"并附"-01 00:00:00"加到您传递给的每个日期来修复代码createFromFormat,这将锚定DateTime您返回到月初.