2010-08-05 44 views
5

我有一個很奇怪的問題,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

誰能告訴我什麼,我做錯了什麼?

回答

13

從ZF問題跟蹤,似乎這是一個已知的問題:

最近很多ZF用戶都提交了Zend_Date返回錯誤的一年,2009年,而不是2008年。但是,這是預期的行爲的錯誤,並不是一個錯誤!

從常見問題:

使用時在代碼中自己的格式,你可以來找你在哪裏得到,例如2009年12月29日的情況,但你有望獲得2008年12月29日。

有一年差異:2009年而不是2008年。你應該使用較低的年份常數。看到這個例子:

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

代替

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

從手動

注意,默認ISO格式從PHP的格式,可如果你還沒有在以前的使用會刺激不同。特別是Year和Minute的格式說明符通常不會以預期的方式使用。

一年有兩個說明符常常被誤認爲可用。 ISO年份的Y說明符和實際年份的y說明符。差別很小但很重要。 Y計算ISO年份,通常用於日曆格式。例如2007年12月31日。實際年份是2007年,但是它是2008年第一週第​​一週的第一天。所以,如果你使用'dd.MM.yyyy',你會得到'31.December.2007',但如果你使用'dd.MM.YYYY',你會得到'31。12月。2008'。正如你所看到的,這不是一個錯誤,而是一個預期的行爲,取決於使用的說明符。

一分鐘的差異並不大。與使用i的PHP不同,ISO使用說明符m來表示分鐘。所以如果你的格式沒有得到,請檢查你是否使用了正確的說明符。

+0

謝謝,愚蠢的我,我沒有再看。 – 2010-08-05 10:55:14

+1

我希望我會在4個小時前看到這個! – ashurexm 2010-12-30 03:54:27

+0

這應該被標記爲答案 – Sonny 2011-08-24 20:18:25

0

爲了增加zwip's answer,會發生什麼幕後是你的日期格式YYYY-MM-dd實際上是轉化爲o\-m\-d,然後將其傳遞給PHP的date()功能在內部與您提供的時間戳。

正如在其他答案中提到的,以及在date format頁面上o格式的文檔中所述,基於ISO周計算年份有時會導致該年與您期望的值不同。