Ошибка в Zend_Date (назад во времени)
У меня очень странная проблема, Zend_Date конвертирует мою временную метку в год раньше.
В моих действиях:
// Timestamp
$intTime = 1293922800;
// Zend_Date object
$objZendDate = new Zend_Date($intTime);
// Get date
echo date('Y-m-d',$intTime).'<br>';
echo $objZendDate->get('YYYY-MM-dd');
Это выводы: 2011-01-02 2010-01-02
Может кто-нибудь сказать мне, что я делаю не так?
2 ответа
Из трекера проблем ZF кажется, что это известная проблема:
В последнее время многие пользователи ZF сообщают об ошибке, что Zend_Date возвращает неправильный год, 2009 вместо 2008 года. Однако это ожидаемое поведение, а НЕ БАГ!
Из FAQ:
При использовании собственных форматов в вашем коде вы можете столкнуться с ситуацией, например 29.12.2009, но вы ожидаете получить 29.12.2008.
Разница в один год: 2009 вместо 2008. Вы должны использовать константу года с меньшим значением в регистре. Смотрите этот пример:
$ Дата-> ToString('ДД.ММ.ГГГГ');
вместо
$ Дата-> ToString('ДД.ММ.ГГГГ');
Из руководства
Обратите внимание, что формат ISO по умолчанию отличается от формата PHP, что может раздражать, если вы не использовали ранее. Особенно спецификаторы формата для Года и Минуты часто не используются по назначению.
В течение года доступны два спецификатора, которые часто ошибаются. Спецификатор Y для года ISO и спецификатор y для реального года. Разница небольшая, но значительная. Y вычисляет год ISO, который часто используется для форматов календаря. См., Например, 31 декабря 2007 года. Реальный год - 2007, но это первый день первой недели первой недели 2008 года. Итак, если вы используете "dd.MM.yyyy", вы получите "31. Декабря 2007 года", но если вы используете "ДД.ММ.ГГГГ", вы получите "31. Декабря 2008 года". Как видите, это не ошибка, а ожидаемое поведение в зависимости от используемых спецификаторов.
Для минуты разница не такая большая. ISO использует спецификатор m для минуты, в отличие от PHP, который использует i. Поэтому, если у вас нет минут в вашем формате, проверьте, правильно ли вы указали спецификатор.
Чтобы добавить к ответу zwip, то, что происходит за сценой, это то, что ваш формат даты YYYY-MM-dd
на самом деле переводится на o\-m\-d
, который затем передается в PHP date()
работать внутри с отметкой времени, которую вы предоставили.
Как упомянуто в другом ответе, и в документации для o
format на странице формата даты, вычисление года на основе недели ISO иногда может привести к тому, что год будет отличаться от ожидаемого значения.