Zend_Date,ISO_8601,日期解析和本地系统时钟

时间:2013-01-31 13:16:58

标签: php zend-framework zend-date

我对Zend_Date对象有一个奇怪的问题。

似乎setter使用不同的系统时钟日期执行不同的操作。 我们假设系统日期是2013年1月28日,代码如下:

$now=new Zend_Date(Zend_Date::ISO_8601);
$now->now();
echo '<br/>now: ' . $now->toString();
echo '<br/>now->day: ' . $now->get(Zend_Date::DAY);
echo '<br/>now->month: ' . $now->get(Zend_Date::MONTH);
echo '<br/>now->year: ' . $now->get(Zend_Date::YEAR);
$end=new Zend_Date('2013-02-25 14:23:34', Zend_Date::ISO_8601);
echo '<br/>end: ' . $end->toString();
$end->setHour('23')->setMinute('59')->setSecond('59')->setDay($now->get(Zend_Date::DAY))->setMonth($now->get(Zend_Date::MONTH))->setYear($now->get(Zend_Date::YEAR));
echo '<br/>endAfterSetters: ' . $end->toString();

将产生以下输出:

now: 28-01-2013 14:04:28
now->day: 28
now->month: 01
now->year: 2013
end: 25-02-2013 14:23:34
endAfterSetters: 28-01-2013 23:59:59

但如果您将系统时钟更改为2013年1月29日,则输出与预期不同:

now: 29-01-2013 14:07:22
now->day: 29
now->month: 01
now->year: 2013
end: 25-02-2013 14:23:34
endAfterSetters: 01-01-2013 23:59:59

上次输出 01-01 -2013 23:59:59,但应 29-01 -2013 23:59:59!

它发生在PHP 5.3.2和5.3.16,Zend_Framework 10.7,最新的Zend_Date 24880版本上。

过去每件事都很好。

任何想法为什么会发生?

P.S。:我在1月29,30,31使用它时发现了jquery datatime插件故障...但我将在其他问题中描述它。

1 个答案:

答案 0 :(得分:2)

请记住,按顺序调用您的setter。因此,当您致电setDay(29)时,您告诉它将日期更改为 2013年2月29日,这不是一个有效的日期,所以它正在滚动以使其成为 1st 2013年3月。然后拨打setMonth(1),将月份更改为1月,为您提供 2013年1月1日

您可以通过将extend_month选项传递给Zend_Date构造函数来控制此行为,请参阅:http://framework.zend.com/manual/1.12/en/zend.date.overview.html#zend.date.options.extendmonth