2016-10-01 85 views
2

在PHP 5.6.14這樣做:這是一個PHP日期錯誤?

$a = strtotime('2016-10-01'); 
$b = $a+29*24*3600; 
$c = $a+30*24*3600; 
die(date("d/m/Y",$b).' - '.date("d/m/Y",$c)); 

將返回30/10/2016 - 30/10/2016

,因爲我希望$c真奇怪是31/10/2016而不是30/10/2016。它是一個PHP的錯誤?

說明:我知道有幾種方法可以執行日期操作,但我特別在此問。如果我將$a月份更改爲10以外的其他數字(例如8,9,11,12),它會給我預期的結果。

+0

總是檢查你的假設'var_dump($ a,$ b,$ c)'。你假設b和c有一定的價值,但你認爲是錯的。 – goat

+1

這也是爲什麼'DateTime'是爲PHP添加日期的高級方法 – Machavity

+2

我認爲這與夏令時有關 - 就好像你也用小時輸出一樣,你會得到'30/10/2016 00:00 - 30/10/2016 23:00',我們在10月30日(至少在我的國家)扣除一小時(因爲DST)。 – Qirel

回答

1

解決這個問題的方法是添加中午,像這樣:

$a = strtotime('2016-10-01 12:00'); 
$b = $a+29*24*3600; 
$c = $a+30*24*3600; 
die(date("d/m/Y",$b).' - '.date("d/m/Y",$c)); 

的原因是因爲你沒有包含時間,所以PHP假定「現在」爲strtotime一部分時間。然後,在您所在的國家/地區(服務器所在的國家/地區),您可以在十月節省一晝夜的光,並且這會縮短關閉時間值$c

中午加班(12:00)爲您提供緩衝。它不需要是12:00,因爲1:00可以工作,但我個人喜歡在12:00工作。

+0

謝謝!我沒有想過它因爲我住在一個沒有它的國家:) – Idi

+0

剛剛檢查了php.ini設置,是的它是「歐洲/柏林」。將它改爲「亞洲/雅加達」解決了它。 – Idi

+0

很高興有幫助。 – Tigger