2015-05-29 51 views
3

的下面幾行代碼返回在兩個不同的服務器組成的兩個不同的輸出和B:PHP的strtotime行爲

echo date("M Y", strtotime("2015-01")); 
echo date("M Y", strtotime("2015-02")); 

預期輸出爲「2015年1月」和「2015年2月」,這是在服務器A正確。

但服務器B上相同的代碼返回輸出「簡2015」和「2015年3月」。

在調試時,我發現服務器B上的strtotime函數總是返回每個月當前日期的時間戳(今天是29日),這就解釋了爲什麼「2015-02」顯示爲「2015年3月」(因爲沒有2015年2月29日)。昨天,該代碼是返回兩臺服務器上相同的輸出,因爲2月28日是有效的,正確翻譯爲二月2015年

所以基本上,在服務器A上,有效的代碼是

echo date("M Y", strtotime("2015-01-01")); 
echo date("M Y", strtotime("2015-02-01")); 

,而在服務器B,有效的代碼是

echo date("M Y", strtotime("2015-01-29")); //or, strtotime("2015-01-[current day]") 
echo date("M Y", strtotime("2015-02-29")); 

爲什麼會出現這兩個服務器之間的這種差異?

+3

時區差異。這是爲什麼你不應該像這樣濫用'strtotime()'的原因之一。 – Sammitch

+0

@Sammitch你很快......;) –

+0

@Sammitch我不認爲這是時區問題。任何時區如何能與其他時區相隔29天?正如我所提到的,它假設服務器B上當月的當天。 –

回答

2

這與不同版本的PHP的問題。有在PHP 5.2.7一個BC,從documentation

在PHP 5之前5.2.7,要求在一個月內給定 平日的特定的事件如該工作日是的第一天月 會錯誤地將一週添加到返回的時間戳。這已經在5.2.7及更高版本中得到糾正 。

Demo

服務器A具有PHP> 5.2.7,服務器B具有PHP < 5.2.7。

+0

您對服務器上的PHP版本是正確的。雖然我不明白這些文檔。 strtotime的輸入只是「2015-02」,那麼爲什麼它會將當前日期添加到此?文檔說它會錯誤地將一週添加到返回的時間戳,但在這種情況下,它是超過4周。 –

+0

我真的不知道這件事。還有更奇怪的行爲,在php <= 5.1.6中,strtotime返回其他值。我認爲我們可以調查,但我們只是失去時間。各方面。 – Federkun