Ошибка в Zend_Date (назад во времени) - PullRequest
5 голосов
/ 05 августа 2010

У меня очень странная проблема, 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 ]

13 голосов
/ 05 августа 2010

Из системы отслеживания проблем ZF кажется, что это известная проблема:

В последнее время многие пользователи ZF сообщают об ошибке, что Zend_Date возвращает неправильный год, 2009 вместо 2008. Однако это ожидаемое поведение,и НЕ ОШИБКА!

Из FAQ:

При использовании собственных форматов в вашем коде вы можете столкнуться с ситуацией, когда вы получите, например, 29.12.2009, но вы ожидали получить 29.12.2008.

Существует разница в один год: 2009 вместо 2008. Вы должны использовать константу нижнего регистра.См. Этот пример:

$ date-> toString ('dd.MM.yyyy');

вместо

$ date-> toString ('dd.MM.ГГГГ ');

Из руководства

Обратите внимание, что формат ISO по умолчанию отличается от формата PHP, что может раздражать, если вы не использовали его ранее.В частности, спецификаторы формата для года и минуты часто не используются по назначению.

Для года доступны два спецификатора, которые часто ошибаются.Спецификатор Y для года ISO и спецификатор y для реального года.Разница небольшая, но значительная.Y вычисляет год ISO, который часто используется для форматов календаря.См., Например, 31 декабря 2007 года. Реальный год - 2007, но это первый день первой недели первой недели 2008 года. Итак, если вы используете «dd.MM.yyyy», вы получите«31. Декабря 2007 года», но если вы используете «ДД.ММ.ГГГГ», вы получите «31. Декабря 2008 года».Как видите, это не ошибка, а ожидаемое поведение в зависимости от используемых спецификаторов.

Для минуты разница не так велика.ISO использует спецификатор m для минуты, в отличие от PHP, который использует i.Поэтому, если у вас нет минут в вашем формате, проверьте, правильно ли вы указали спецификатор.

0 голосов
/ 05 августа 2010

Чтобы добавить к ответу zwip , за кадром происходит то, что ваш формат даты YYYY-MM-dd фактически переводится в o\-m\-d, который затем передается в функцию PHP date() внутри с отметкой времени. Вы предоставили.

Как упоминалось в другом ответе и в документации для формата o на странице в формате даты , вычисление года на основе недели ISO иногда может привести к тому, что год будет равен единице. отличается от ожидаемого значения.

...