2013-10-31 76 views
4

看一看这段代码: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"; 

输出为米DIFF:0 Y,DIFF:3

为什么它返回一个错误月的差异?

有趣的是,如果我将日期更改为'2001-08'和'1998-07',它会返回正确的月份间隔== 1。

谢谢!

+0

如果您添加一天(如'2001-07-01'和'1998-06-01',格式为'Ymd' –

+0

会发生什么?不能这样做,因为我从数据库中获取日期,并且它可能包含在我的情况下,这一天是无关紧要的 - 只有一个月的差异是重要的 – user2723490

回答

8

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

DateTime::createFromFormat('Y-m', '2011-07')给出了一个DateTime具有2011年的,7月和日,小时,分钟,距离当前时间(采取在我写这篇文章的那一刻第二2011-07-31 18:05:47

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

两个日期是3年,0个月和30天。

在你的2001-081998-07例如,这两个月正好有31天,所以算算出来正确。这个bug是难以确定的,因为它取决于代码是运行的日期,尽管它看起来并不明显。

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

+1

+1击败了我 –

+1

谢谢,我已经在挖掘到区间对象之后意识到它了,它似乎是更容易计算与“Ym”直接相差的月份差异($ y1 * 12 + $ m1) - ($ 2 * 12 + $ m2) – user2723490

+0

@ user2723490,这似乎也很合理。我没有看到任何非12个月在可预见的未来几年:) – hobbs