2017-07-14 77 views
4
$startDate = new DateTime("2016-06-01"); 
$endDate = new DateTime("2016-06-30"); 
$diff = date_diff($startDate,$endDate); 
$differenceYear = $diff->format("%y"); 
$differenceMonth = $diff->format("%m"); 
$difference = $differenceYear*12 + $differenceMonth; 
echo $difference; 

上面的代碼將輸出0作爲結果。但是,當我將這兩個日期更改爲2016-12-01和2016-12-31時,代碼會給出1作爲輸出。爲什麼會發生?PHP日期差誤差

當我檢查這個代碼在網上PHP編輯它給出了正確的答案。但是當我將它複製到本地機器時,答案顯示錯誤。在線編輯器有美國/太平洋地區作爲時區。我的電腦有亞洲/加爾各答時區。這兩個具有相同的PHP版本

+1

代碼輸出'1'我。你使用哪個PHP版本? – modsfabio

+0

@modsfabio它關於時區兄弟.. – Xatenev

+1

親愛的六月份只有30天,你通過2016-06-31,這就是爲什麼你會得到錯誤 –

回答

1

這是一個時區的問題。我建議您根據日期字符串(如2016-12-01 00:00:00 +00:00)創建DateTime對象,以便您始終以UTC工作。

$startDate = new DateTime("2016-12-01 00:00:00 +00:00"); 
$endDate = new DateTime("2016-12-31 00:00:00 +00:00"); 
$diff = date_diff($startDate,$endDate); 
$differenceYear = $diff->format("%y"); 
$differenceMonth = $diff->format("%m"); 
var_dump($differenceYear,$differenceMonth); 
$difference = $differenceYear*12 + $differenceMonth; 
echo $difference; 

(從Xatenev的評論採取的代碼,否則這個答案看起來很短;-)

+1

https://3v4l.org/Hj57H這可能會更好地顯示差異。 – Xatenev

+0

那麼我怎麼才能得到正確的答案呢? –

3

使用我的默認時區(Europe/Bucharest),一個print_r($diff)生產:

DateInterval Object 
(
    [m] => 1 
    [d] => 0 
    [days] => 30 
) 
# I removed the other components as they are irrelevant to the question 
# and they are 0 anyway. 

它的意思是:「 1個月和0天」(以下md屬性),在總(該days屬性)30天。

使用Asia/Kolkata它打印的默認時區:

DateInterval Object 
(
    [m] => 0 
    [d] => 30 
    [days] => 30 
) 
# Again, all the other object properties are 0 and irrelevant for the question 

這一個意思:「0個月和30天」,在總30天。


正如你所看到的,天的總數(該days屬性)是相同的(30)和正確的。

關於「1個月和0天」「0月提前30天」,他們兩人都是正確和不正確的同一時間。

什麼的「一個月」的定義是什麼?它可以是2831天之間的任何值。這意味着,「1個月零天」等於「0個月和28天」,「0個月和29天」 a.s.o. 在同一時間


問題題曰「PHP的時間差錯誤」 - 沒有在PHP的時間差沒有錯誤。這只是人類語言和文化中術語"month"的鬆散定義。

+0

那麼我應該如何使用答案。但事情是同一時期給了我錯誤的答案。 ** 2016-06-01 **和** 2016-06-30 **給出0和** 2016-12-01 **和** 2016-12-31 **給出1作爲輸出 –

+0

多少天做一個月? – axiac