2013-01-31 54 views
0

我對Zend_Date對象有一個奇怪的問題。Zend_Date,ISO_8601,日期解析和本地系統時鐘

看起來setters在不同的系統時鐘日期執行不同的操作。 讓我們假設系統日期爲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版本。

Everyting在過去工作得很好。

任何想法爲什麼會發生?

P.S .:我也在1月29,30,31使用它時發現了jquery datatime plugin malfunciton ...但我會在其他問題中描述它。

回答

2

請記住,您的設置者是按順序調用的。所以當你打電話給setDay(29)時,你會告訴它將日期更改爲2013年2月29日,這不是有效的日期,因此它正在滾動,以使它變成2013年3月1日。然後您撥打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

+0

這是事實。 Setter序列是問題。重新排序setMonth($ m) - > setDay($ d)解決了它。謝謝! –