Zend_Date中的错误(及时)

时间:2010-08-05 09:37:54

标签: zend-framework zend-date

我有一个非常奇怪的问题,Zend_Date将我的时间戳转换为一年前。

在我的行动中:

// Timestamp
$intTime = 1293922800;

// Zend_Date object
$objZendDate = new Zend_Date($intTime);

// Get date

echo date('Y-m-d',$intTime).'<br>';
echo $objZendDate->get('YYYY-MM-dd');

这输出: 2011-01-02 2010-01-02

谁能告诉我我做错了什么?

2 个答案:

答案 0 :(得分:13)

从ZF问题跟踪器看来,这是一个已知问题:

最近很多ZF用户正在提交Zend_Date在2009年而不是2008年返回错误年份的错误。但这是预期的行为,而不是一个BUG!

来自常见问题:

在您的代码中使用自己的格式时,您可能会遇到例如29.12.2009的情况,但您希望得到29.12.2008。

有一年的差异:2009年而不是2008年。您应该使用较低的年度常数。见这个例子:

$日期 - &GT;的toString( 'DD.MM.YYYY');

而不是

$日期 - &GT;的toString( 'DD.MM.YYYY');

来自手册

请注意,默认的ISO格式与PHP的格式不同,如果您之前没有使用过,这种格式可能很烦人。特别是年份和分钟的格式说明符通常不会以预期的方式使用。

对于一年,有两个可用的说明符经常被误解。 ISO年份的Y说明符和实际年份的y说明符。差异很小但很重要。 Y计算ISO年份,通常用于日历格式。例如,参见2007年12月31日。实际年份是2007年,但它是2008年第1周第一周的第一天。所以,如果你使用'dd.MM.yyyy',你会得到'31。2007年12月'但如果你使用'dd.MM.YYYY',你将获得'31。2008年12月'。如您所见,这不是错误,而是预期的行为,具体取决于使用的说明符。

分钟差异不是那么大。与使用i的PHP不同,ISO使用分钟的m。因此,如果您的格式没有得到任何分钟,请检查您是否使用了正确的说明符。

答案 1 :(得分:0)

要添加到zwip's answer,幕后发生的事情是您的日期格式YYYY-MM-dd实际上已转换为o\-m\-d,然后在内部传递给PHP的date()函数你提供的时间戳。

如其他答案中提到的,以及date format页面上o格式的文档中提到的,基于ISO周的年度计算有时会导致年份不同达到您期望的价值。

相关问题