Неверный DateInterval с разницей DateTime

Я сравниваю два 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 вычисляет неправильное количество часов (3 слишком много), и я думаю, что это аналогичная проблема, но я не могу найти решение, чтобы продолжать использовать ->sub(). Любые идеи ?

Если вы думаете, что это может быть проблема с часовым поясом, я проверил все свои DateTime, и у всех у них часовой пояс установлен на «Европа/Берлин», поэтому я не думаю, что это происходит отсюда.

Спасибо !


person cocoggu    schedule 10.03.2014    source источник


Ответы (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
person Mike    schedule 10.03.2014
comment
Большое тебе спасибо ! Работает как шарм - person cocoggu; 11.03.2014