5

我有一个非常奇怪的问题, 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

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

4

2 回答 2

13

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

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

从常见问题解答:

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

有一年的差异:2009 年而不是 2008 年。您应该使用小写年份常数。看这个例子:

$date->toString('dd.MM.yyyy');

代替

$date->toString('dd.MM.YYYY');

从手册

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

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

分钟差异不是那么大。ISO 使用说明符 m 表示分钟,不像 PHP 使用 i。因此,如果您的格式没有时间,请检查您是否使用了正确的说明符。

于 2010-08-05T10:05:12.040 回答
0

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

就像另一个答案中提到的那样,以及日期格式o页面上的格式文档中,基于 ISO 周的年份计算有时会导致年份与您期望的值不同。

于 2010-08-05T10:17:33.247 回答