Zend_Date добавление часового пояса к результату вычитания

У меня есть этот код:

<?php
    $start = new Zend_Date("2011-09-06T10:00:00+02:00",Zend_Date::ISO_8601);
    $end   = new Zend_Date("2011-09-06T10:01:00+02:00",Zend_Date::ISO_8601);
    echo $end->sub($start);
?>

Короче говоря: я создаю две даты с минутной разницей между ними. Затем я распечатываю разницу (вычитание) между ними.

Результат, однако, таков:

01-01-1970 02:01:00

По сути, из этого поведения я понимаю, что Zend_Date работает с датами без учета часового пояса, а затем возвращает часовой пояс в результат. Конечно, это означает, что результат вычитания отключен значением часового пояса (+2 часа в моем случае).

Какой лучший способ обойти это?

1 ответ

Решение

Да, когда эхо Zend_Date, это будет учитывать ваш часовой пояс. Чтобы получить разницу, отформатированную для дат по Гринвичу, вы должны явно установить часовой пояс:

$start = new Zend_Date("2011-09-06T10:00:00+02:00",Zend_Date::ISO_8601);
$end   = new Zend_Date("2011-09-06T10:01:00+02:00",Zend_Date::ISO_8601);
echo $end->sub($start)->setTimezone('GMT')->get(Zend_Date::ISO_8601);

Это вывело бы: 1970-01-01T00:01:00+00:00

В отношении sidenote, если вам не нужны функции динамической локализации Zend_Date, лучше избегать этого в пользу PHP или родного API DateTime. На самом деле нет причин использовать Zend_Date только потому, что он существует в ZF. PHP собственный DateTime API быстрее и проще в использовании. Получение разницы во времени с помощью API DateTime будет

$start = new DateTime("2011-09-06T10:00:00+02:00");
$end = new DateTime("2011-09-06T10:01:00+02:00");
echo $start->diff($end)->format('%H:%I:%S');

который будет выводить 00:01:00

Другие вопросы по тегам