我在使用PHP的DateTime diff方法时遇到了一个奇怪的问题。我现在一直在使用DateTime方法,并认为我已经掌握了它,但这个问题让我感到惊讶。
我使用diff方法确定两个日期之间的月/天数。 今天,我使用了以下代码:
$start = new DateTime('2012-03-01');
$end = new DateTime('2012-03-31');
$period = $start->diff($end);
var_dump($period);
产生了以下输出:
object(DateInterval)[3]
public 'y' => int 0
public 'm' => int 1 // Shouldn't this be 0?
public 'd' => int 1 // And where does this come from? Would expect 30.
public 'h' => int 0
public 'i' => int 0
public 's' => int 0
public 'invert' => int 0
public 'days' => int 30
正如我上面的评论所说,1m1d来自哪里(我预计0m30d)。我不能为我的生活弄清楚它从哪里获得这个价值。我也尝试将午夜时间戳00:00:00
置于两个日期之后,以确保它不是时间问题,但这对输出没有任何影响。
有人可以向我解释这个结果吗? 我的Debian开发服务器上出现此问题,运行PHP 5.3.3并安装Xdebug 2.1.1和Suhosin 0.9.32.1。
更新
在我的生产服务器上重现了这个问题,该服务器在CentOS 6.0上,带有“原始”PHP 5.3.8,没有任何扩展/补丁。
更新2
我设法找到了“解决方法”(仅在此时工作)。如果我将绝对日期更改为:
$start = new DateTime('first day of next month');
$end = new DateTime('last day of next month');
确实输出0m30d。尽管如此,我仍然对上述事情感到困惑,所以如果有人对此有所了解,请告诉我!
答案 0 :(得分:4)
恭喜,您刚刚发现夏令时!如果您使用DST切换检查您的时区,您会看到$ start实际上是2月29日,而$ end是3月30日。 (2-3)= 1(因此,m = 1),(29-30)= 1(因此,d = 1)。
答案 1 :(得分:1)
我得到的结果与你不一样,我的结果确实没问题......
object(DateInterval)#3 (8) {
["y"]=>
int(0)
["m"]=>
int(0)
["d"]=>
int(30)
["h"]=>
int(0)
["i"]=>
int(0)
["s"]=>
int(0)
["invert"]=>
int(0)
["days"]=>
int(30)
}
获得1个月不正常导致ISNT即使在两个日期之间还有一个月,1个月将是
$start = new DateTime('2012-03-01');
$end = new DateTime('2012-04-01');
我在这里看到的是你可能有-1天1个月而不是30天你认为你看到1天1个月,或者你得到的代码不是你在这里粘贴的......
你能开导我们吗?由于
答案 2 :(得分:0)
this页面上的评论(PHP手册)似乎表明该功能在某些平台或某些输入范围内可能非常错误。
这可能是导致问题的原因。