2013-10-10 41 views
0

我使用DateTime和差異來計算兩個日期之間的天數的區別如下:日期時間差異返回怪異輸出

$data_inceput = '2013-10-01'; 
$data_sfarsit = '2013-10-31'; 
$date1 = new DateTime($data_inceput); 
$date2 = new DateTime($data_sfarsit); 

$nr_zile = $date2->diff($date1)->format("%a"); 

$nr_zile出來作爲6015的一些原因。

如果我`var_dump($date2->diff($date1));

我得到:

object(DateInterval)#6 (8) { 
    ["y"] => int(0) 
    ["m"] => int(0) 
    ["d"] => int(30) 
    ["h"] => int(0) 
    ["i"] => int(0) 
    ["s"] => int(0) 
    ["invert"] => int(1) 
    ["days"] => int(6015) 

任何想法,爲什麼它的行爲這樣?我也嘗試將UTC的時區設置爲每個日期,並獲得相同的結果。

編輯:我在生產服務器上測試過,它工作得很好,唯一的問題是在本地的apache服務器上,但php設置基本上是兩個相同的。

+0

的PHP版本您使用的?我在PHP 5.3.13上測試了這個代碼,並且沒有問題($ nr_zile出來的時候是30) –

+0

列舉檢查。它也適用於我在遠程服務器上,但給我在我的本地apache服務器上面的結果...甚至是PHP設置基本相同 – Bogdan

+0

您是否在創建DateTime實例之前設置UTC時區,使用'date_default_timezone_set '?如果沒有,請做...所有相同的結果:'diff'結果相當奇怪,但是您是否願意使用'date_default_timezone_get'來說明您所在的時區? –

回答

2

這是Windows的https://bugs.php.net/bug.php?id=51184

升級到最新的PHP版本問題,或者使用這方面的任何替代的解決方案。

+0

是的,這似乎是問題,我不能只升級到最新的PHP版本。猜猜我必須改變我計算日期差異的方式。 – Bogdan

1

你可以使用另一種方法:

$data_inceput = strtotime('2013-10-01'); 
$data_sfarsit = strtotime('2013-10-31'); 
$daysBetween = round(($data_sfarsit - $data_inceput)/86400); 
+0

我結束了使用這種方法,即使存在一些錯誤的可能性(主要是關於DST),但我並不介意,因爲我只對天而非小時感興趣,並且錯誤不是累積的。 – Bogdan