看一下这段代码:
$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.
谢谢!
答案 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-08
和1998-07
的示例中,两个月恰好都有第31天,因此数学计算正确。这个错误很难确定,因为它取决于代码运行的日期,即使它看起来并不明显。
您可以使用"Y-m-d H:i:s"
格式修改代码,并将"-01 00:00:00"
附加到createFromFormat
的每个日期,这将锚定DateTime
您获得的回复到月初。