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 格式的问题的主要内容,如果未能解决你的问题,请参考以下文章