Проблема с форматом Zend_Date и ISO_8601

Честно говоря, я сбит с толку. Может кто-нибудь сказать мне, почему я получил сообщение об ошибке с этим кодом?

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

if(Zend_Date::isDate($date, Zend_Date::ISO_8601)) {
    print('success');
} else {
    print('failure');
}

exit;

Это также не сработает, если я просто передам объект Zend_Date.

ОБНОВИТЬ:

var_dump исходного объекта $date выглядит так:

object (Zend_Date) # 107 (8) {["_locale: private"] => string (5) "en_US" ["_fractional: private"] => int (0) ["_precision: private"] => int (3) ["_unixTimestamp: private"] => int (1257508100) ["_timezone: private"] => string (14) "America / Denver" ["_offset: private"] => int (25200) ["_syncronised: private "] => int (0) [" _dst: protected "] => bool (true)}

И var_dump строки $date после вызова $date->getIso() выглядит так:

строка (25) "2009-11-06T04:48:20-07:00"

Я использую ZF 1.9.5 на PHP 5.2.8. Я использую XAMPP для Windows тоже, если это имеет значение.

2 ответа

Решение

Я использую ZF 1.9.4 и PHP 5.2.10 в Ubuntu и смог воспроизвести ту же проблему, что и у вас. Будучи любопытным типом, я немного покопался. В коде для isDate сначала был сделан вызов getDate в сопутствующем классе Zend_Locale_Format. Это обернуто вокруг цикла try-catch, поэтому в части catch я сделал вывод исключения в stdout. Вот что дамп исключений показал мне:

исключение 'Zend_Locale_Exception' с сообщением 'Невозможно проанализировать дату 
'2009-11-06T04:26:46-08:00' с использованием 'dd mm yy' (d  y)'в /usr/share/php/libzend-framework-php/Zend/Locale/Format.php:995
Трассировки стека:
#0 /usr/share/php/libzend-framework-php/Zend/Locale/Format.php(1116): Zend_Locale_Format::_parseDate('2009-11-06T04:2...', Array)
#1 /usr/share/php/libzend-framework-php/Zend/Date.php(4583): Zend_Locale_Format::getDate('2009-11-06T04:2...', Array)
#2 {censored}/testbed/test.php(26): Zend_Date::isDate('2009-11-06T04:2...', 'c')
#3 {main}

Создание var_dump для этого исключения немного больше рассказывало об этих непрозрачных массивах. Каждый из них содержал следующее:

 массив (4) {                                                                       
          ["Локаль"]=>                                                                   
          строка (5) "en_US"                                                              
          ["Date_format"]=>                                                              
          строка (8) "дд мм гг"                                                           
          [ "Format_type"]=>                                                              
          строка (3) "iso"                                                                
          ["Fix_date"]=>                                                                 
          BOOL (ложь)                                                                    
        }           

Итак, date_format выглядит не совсем правильно. Это должно быть "YYYYMMDD'T'hh:mm:ssP" или что-то в этом роде в формате PHP для форматирования даты (я цитировал букву T, так как это буквально 'T', а не сокращение часового пояса). Конечно, PHP просто сокращает его до 'c'.

Странный. Так, где в мире это получает этот формат даты? От _getLocalizedToken:

 защищенная статическая функция _getLocalizedToken($token, $locale)
    {
        switch($token) {
            case self::ISO_8601:
                возврат "дд мм гг";
                перерыв;
...

Этот формат выглядит совершенно неверно, учитывая вывод, который выдает ISO_8601.

Я бы, вероятно, сверился с людьми из соответствующего списка Zend, но на первый взгляд это выглядит как нечто достойное сообщения об ошибке. Может быть, они просто пока не поддерживают проверки этого конкретного типа строки даты?

Извините, я прочитал это так долго после того, как вы опубликовали это. Код, который вам не подходит, работает для меня, попробуйте использовать автономный класс Zend/Date в источнике php, например:


set_include_path('./lib' . PATH_SEPARATOR . get_include_path());
include_once 'Zend/Date.php';
...

И вам, вероятно, также нужно установить php.ini так:

include_path = ".: / usr / share / php: / usr / share / php / smarty / libs: / opt / zend / library"

Или где твои зенд-либы.

Тогда это показывает "успех". Надеюсь, это поможет.

Редактировать: Вы, вероятно, также хотите ОТКЛЮЧИТЬ простое использование Zend, я хотел только класс Date, так как он вроде как сходит с ума.

Редактировать: я использую расширение Zend 220060519, которое похоже на Zend Engine v2.2.0./ PHP 5.2.6-1+lenny8 Когда я гуглял это, я наткнулся на несколько ссылок, которые объясняли, что есть (был?) Другой раздел класса Date в рамки Zend, которые не были одинаковыми. Но я могу ошибаться, эта ссылка помогла мне найти причину, но в то время у меня короткая память о моем мыслительном процессе:)

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