Почему Zend_Date учитывает только часовые пояса при синтаксическом анализе?

Я работаю с Zend 1.8. Я установил часовой пояс по умолчанию для Европы/Хельсинки и анализирую строку, которая выглядит так:

2009-08-06

с таким заявлением:

 new Zend_Date($dateStr, 'YYYY-MM-dd');

Получается такая дата:

object(Zend_Date)#53 (8) {
  ["_locale:private"]=>
  string(5) "en_US"
  ["_fractional:private"]=>
  int(0)
  ["_precision:private"]=>
  int(3)
  ["_unixTimestamp:private"]=>
  string(10) "1249502400"
  ["_timezone:private"]=>
  string(15) "Europe/Helsinki"
  ["_offset:private"]=>
  int(-7200)
  ["_syncronised:private"]=>
  int(0)
  ["_dst:protected"]=>
  bool(true)
}

Так что он, видимо, знает часовой пояс. Однако, когда я пытаюсь получить строковое представление даты, я получаю не 2009-08-06, а 2009-08-05 23:00:00 - время UTC. Что дает?

Редактировать: я также добавил ответ, но версия заметок об обрыве такова: Zend_Date::getDate() не работает, а не биты синтаксического анализа или печати.


person Rytmis    schedule 06.08.2009    source источник
comment
На самом деле это не связано, но важно: просто чтобы вы знали, средство форматирования YYYY дает вам год ISO, который немного отличается от того, что вы ожидаете. Это не причина вашей проблемы, а действительно распространенная проблема с Zend_Date. Вероятно, вам следует использовать yyyy   -  person jason    schedule 06.08.2009
comment
Не могли бы вы опубликовать строку кода, которую вы используете для генерации вывода?   -  person jason    schedule 08.08.2009


Ответы (3)


Ну, как обычно, мои предположения были ошибочными. Я вернулся, чтобы проверить все шаги, которые могут пойти не так, и, как это бывает, часовые пояса работают нормально при разборе и печати. Проблема в Zend_Date::getDate(). В документации сказано следующее:

Returns a clone of $this, with the time part set to 00:00:00.

Однако, когда я на самом деле использую его:

$date = Zend_Date::now();
$date = $date->getDate();

Результат

Aug 8, 2009 11:00:00 PM

Это точно не 00:00:00.

Это похоже на ошибку Zend 4490, хотя предположительно она исправлена ​​в 1.7.0 и У меня стоит 1.8.1. Думаю, мне придется снова открыть ошибку.

person Rytmis    schedule 09.08.2009

Вы пытались установить локаль в реестре? Что-то такое :

$locale = new Zend_Locale('fr_FR');
Zend_Registry::set('Zend_Locale', $locale);

(Конечно, с учетом вашего региона)

Поможет ли это?

person Pascal MARTIN    schedule 06.08.2009
comment
Нет, подождите, ложная тревога, извините! (Плохой тест) - person Rytmis; 07.08.2009
comment
Эх, жаль :-( тогда извините :-( - person Pascal MARTIN; 07.08.2009

Посмотрите на Zend_Date __construct DocBlock:

  • Всегда устанавливайте часовой пояс по умолчанию: http://php.net/date_default_timezone_set
  • Например, в вашем бутстрапе: date_default_timezone_set('America/Los_Angeles');
  • Подробные инструкции смотрите в документе.

Если это так, возможно, вам нужно добавить локаль к вызову, например.

Zend_Date($dateStr,'Формат','de_DE');

person Rufinus    schedule 06.08.2009
comment
Если вы еще раз посмотрите на мой вопрос, то заметите, что второе предложение начинается со слов «Я установил часовой пояс по умолчанию на Европу/Хельсинки». И локаль не влияет на смещение часового пояса, все, что она делает, это управляет форматом ввода и вывода. :( - person Rytmis; 07.08.2009