Zend_Date和ISO_8601格式的问题

时间:2009-11-06 11:18:20

标签: php zend-framework zend-date

坦率地说,我很沮丧。任何人都可以告诉我为什么我会用这段代码得到失败的消息?

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

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

exit;

如果我只传入Zend_Date对象,它也会失败。

更新:

初始$ date对象的var_dump如下所示:

object(Zend_Date)#107(8){[“_locale:private”] => string(5)“en_US”[“_fractional:private”] => int(0)[“_ finecision: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)}

调用$ date-> getIso()后,$ date字符串的var_dump如下所示:

string(25)“2009-11-06T04:48:20-07:00”

我在PHP 5.2.8上使用ZF 1.9.5。我也在使用XAMPP for Windows,如果它有所作为。

2 个答案:

答案 0 :(得分:3)

我在Ubuntu上运行ZF 1.9.4和PHP 5.2.10,并且能够重现您遇到的完全相同的问题。作为好奇的类型,我做了一点挖掘。在isDate的代码中,首先在伴侣类Zend_Locale_Format中调用getDate。这是一个try-catch循环,因此在catch部分中,我将它转储到stdout。这是异常转储向我展示的内容:

exception 'Zend_Locale_Exception' with message 'Unable to parse date 
'2009-11-06T04:26:46-08:00' using 'dd mm yy' (d  y)' in /usr/share/php/libzend-framework-php/Zend/Locale/Format.php:995
Stack trace:
#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对于那些不透明的数组更有说服力。每个都包含以下内容:

 array(4) {                                                                       
          ["locale"]=>                                                                   
          string(5) "en_US"                                                              
          ["date_format"]=>                                                              
          string(8) "dd mm yy"                                                           
          ["format_type"]=>                                                              
          string(3) "iso"                                                                
          ["fix_date"]=>                                                                 
          bool(false)                                                                    
        }           

所以,date_format看起来并不正确。它应该是“YYYYMMDD'T'hh:mm:ssP”,或类似的东西,在PHP日期格式化术语中(我引用了T,因为它是文字'T'而不是时区缩写)。诚然,PHP只是将其缩写为'c'。

奇怪。那么在世界上哪个地方获得这种日期格式呢?来自_getLocalizedToken:

 protected static function _getLocalizedToken($token, $locale)
    {
        switch($token) {
            case self::ISO_8601 :
                return "dd mm yy";
                break;
...

考虑到ISO_8601产生的输出,该格式看起来完全错误。

我可能会在相应的Zend列表上与人们核实,但乍一看,这看起来像是一个值得报告错误的东西。也许他们只是不支持检查这种特殊类型的日期字符串呢?

答案 1 :(得分:0)

对不起,我在你发布这篇文章后这么久就看了。出错的代码对我有用,尝试在php源代码中单独使用Zend / Date类,如下所示:


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 libs。

然后它显示'成功'。希望有所帮助。

编辑:你可能也想禁用普通的Zend使用,我只想要Date类,因为它有点像岩石。

编辑:我使用Zend扩展220060519,这似乎是Zend Engine v2.2.0./ PHP 5.2.6-1 + lenny8当我在谷歌搜索时,我来到了几个链接,解释了(是吗?)另一个日期zend框架中的类部分不一样。但我可能错了,这个链接帮助我找到了原因,但我对我当时的思维过程记忆不足:)