php datetime差异返回不正确的结果

时间:2013-04-09 23:50:10

标签: php

所以我在php中有这个代码:

$now= new \Datetime("UTC");
$lv=$user->getLastVisit();
$interval =$lv->diff($now,true);

print_r($interval);
print_r("<br>".$lv->format("Y-m-d H:i:s"));
print_r("<br>".$now->format("Y-m-d H:i:s"));
exit(0);

这是输出:

DateInterval Object ( [y] => 0 [m] => 0 [d] => 0 [h] => 6 [i] => 59 [s] => 6 [invert] => 0 [days] => 0 ) 
2013-04-09 23:44:21
2013-04-09 23:45:15

所以差异结果是6小时59分6秒!但如果我手动做差异我有54秒!那么这个DateTime :: diff函数出了什么问题?

编辑:

这是var_dump($ user-&gt; getLastVisit());

2013-04-09 23:54:59object(DateTime)#320 (3) { ["date"]=> string(19) "2013-04-09 23:44:21" ["timezone_type"]=> int(3) ["timezone"]=> string(19) "America/Los_Angeles" }

1 个答案:

答案 0 :(得分:1)

上次登录时间应为UTC时间23:44,而不是Los_Angeles。 (截至本文撰写时,它仍然不是2013-04-09 23:44:21在洛杉矶!)

您似乎可能将最后一次登录时间存储在数据库中作为UTC,但是当退出数据库时,PHP使用本地/默认时区,并将其视为America/Los_Angeles

见这里:http://3v4l.org/elbLY

请注意,我将$now设置为您所拥有的完全相同的时间(以UTC为单位),我也使用您的$lv时间,首先是在Los_Angeles时区,然后是UTC 。

第一个间隔是你得到的,第二个间隔是正确显示54秒。

所以你需要修复你的$user->getLastVisit()方法并确保它在UTC中提供那个日期,你的差异就可以了。