Zend_Date 和 ISO_8601 格式的问题

Posted

技术标签:

【中文标题】Zend_Date 和 ISO_8601 格式的问题【英文标题】:Problem with Zend_Date and ISO_8601 format 【发布时间】:2009-11-06 11:18:20 【问题描述】:

坦率地说,我很困惑。谁能告诉我为什么我会收到此代码的失败消息?

$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) ["_precision:private"]= > int(3) ["_unixTimestamp:private"]=> int(1257508100) ["_timezone:private"]=> string(14) "美国/丹佛" ["_offset:private"]=> int(25200) [ "_syncronised:private"]=> int(0) ["_dst:protected"]=> bool(true)

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

字符串(25)“2009-11-06T04:48:20-07:00”

我在 php 5.2.8 上使用 ZF 1.9.5。我也在为 Windows 使用 XAMPP,如果这有影响的话。

【问题讨论】:

var_dump($date) 给出了什么? 【参考方案1】:

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

带有消息“无法解析日期”的异常“Zend_Locale_Exception” '2009-11-06T04:26:46-08:00' 在 /usr/share/php/libzend-framework-php/Zend/Locale/Format.php:995 中使用 'dd mm yy' (d y)' 堆栈跟踪: #0 /usr/share/php/libzend-framework-php/Zend/Locale/Format.php(1116): Zend_Locale_Format::_parseDate('2009-11-06T04:2...', 数组) #1 /usr/share/php/libzend-framework-php/Zend/Date.php(4583): Zend_Locale_Format::getDate('2009-11-06T04:2...', 数组) #2 censored/testbed/test.php(26): Zend_Date::isDate('2009-11-06T04:2...', 'c') #3 主要

对这个异常做一个 var_dump 更能说明那些不透明的数组。它们中的每一个都包含以下内容:

数组(4) [“地区”]=> 字符串(5)“en_US” [“日期格式”]=> 字符串(8)“dd mm yy” [“格式类型”]=> 字符串(3)“iso” [“修复日期”]=> 布尔(假)

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

奇怪。那么世界上哪里有这种日期格式呢?来自_getLocalizedToken:

受保护的静态函数 _getLocalizedToken($token, $locale) 开关($令牌) 案例自我::ISO_8601: 返回“dd mm yy”; 休息; ...

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

我可能会与相应的 Zend 列表中的人员核实一下,但乍一看,这似乎是值得报告的错误。也许他们只是不支持检查这种特定类型的日期字符串?

【讨论】:

太棒了!我也挖掘了代码,这就是我得出的结论,但我想确定我不是唯一看到这个的人。【参考方案2】:

很抱歉,在您发布此内容之后,我才读了这么久。对你来说出错的代码对我有用,尝试在 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 库在哪里。

然后它显示“成功”。希望对您有所帮助。

编辑:您可能还想禁用纯 Zend 使用,我只想要 Date 类,因为它有点摇滚。

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

【讨论】:

@Glenn - 这个问题是针对 Zend Framework 1.9.5 发布的,列出的问题对该版本有效,显然也适用于早期版本。你用的是什么版本?我相信这个错误在前一段时间已经修复了,所以在当前版本中这很可能会起作用。

以上是关于Zend_Date 和 ISO_8601 格式的问题的主要内容,如果未能解决你的问题,请参考以下文章

日期和时间格式(ISO 8601)

ISO 8601 和 RFC 3339 日期格式有啥区别?

iOS-时间格式ISO 8601

将 Luxon 日期格式化为 ISO8601 基本格式

使用具有 ISO 8601 格式的“DateTime.LocalNow”

如何使用 T 和 Z 将 LocalDate 格式化为 ISO 8601?