使用DateTime diff的DateInterval错误

时间:2014-03-10 18:27:15

标签: php datetime datediff date-comparison dateinterval

我正在比较两个DateTime:

//Get the current DateTime
$date_now = new DateTime;
var_dump($date_now); // 2014-03-10 19:04:29

// I need to subtract 12 hours (I'm using $date_past to fetch $db_date in a request)
$date_past = $date_now->sub(new DateInterval("PT12H"));

// Get the DateTime from $db_date just fetched in database
$alert_date = new DateTime($db_date);
var_dump($alert_date); // 2014-03-10 17:04:00 in my test

// Get the difference
$diff = $alert_date->diff($date_now);
var_dump($diff->format("%H:%I:%S")); //09:59:31

所以我得到了09:59:31以及$ diff-> invert == 1这意味着它是一个负值。

我看到了这个问题:php datetime->diff is calcualting wrong amount of hours (3 too much)我认为这是类似的问题,但我找不到继续使用的解决方案 - > sub()。有什么想法吗?

如果你认为它可能是TimeZone问题,我检查了所有的DateTime,并且他们都将TimeZone设置为“Europe / Berlin”,所以我认为它不是来自这里。

谢谢!

1 个答案:

答案 0 :(得分:1)

问题在于,当您将对象分配给变量时,会通过引用为其分配。所以当你这样做时:

$date_past = $date_now->sub(new DateInterval("PT12H"));

变量$date_past$date_now都指向完全相同的引用,当您修改它们时,您同时修改它们。如果您只是回显变量,您会注意到这一点:

$date_now = new DateTime;
$date_past = $date_now->sub(new DateInterval("PT12H"));

echo $date_now->format('c'); // 2014-03-10T00:38:56-06:00
echo $date_past->format('c'); // 2014-03-10T00:38:56-06:00

注意它们如何打印完全相同的东西。通常你想要做的是使用clone

$date_past = clone $date_now;
$date_past->sub(new DateInterval("PT12H"));

echo $date_now->format('c'); // 2014-03-10T12:41:20-06:00
echo $date_past->format('c'); // 2014-03-10T00:41:20-06:00