2012-02-23 83 views
2

我有一個PHP的DateTime diff方法奇怪的問題。我一直在使用DateTime方法,並認爲我已經掌握了它,但這個問題讓我感到驚訝。PHP日期時間差異奇怪的結果

我正在使用diff方法來確定兩個日期之間的月/日數。 今天,我用下面的代碼:

$start = new DateTime('2012-03-01'); 
$end = new DateTime('2012-03-31'); 

$period = $start->diff($end); 

var_dump($period); 

這產生了以下的輸出:

object(DateInterval)[3] 
    public 'y' => int 0 
    public 'm' => int 1 // Shouldn't this be 0? 
    public 'd' => int 1 // And where does this come from? Would expect 30. 
    public 'h' => int 0 
    public 'i' => int 0 
    public 's' => int 0 
    public 'invert' => int 0 
    public 'days' => int 30 

正如我的評論上面說,那裏是地獄做的1m1d來自(我希望0m30d)。我不能爲我的生活找出它從哪裏獲得這個價值。我也試着在兩個日期後面放置午夜時間戳00:00:00以確保它不是時間事物,但是這對輸出沒有影響。

有人可以向我解釋這個結果嗎? 這個問題發生在我的Debian開發服務器上,運行Xdebug 2.1.1和Suhosin 0.9.32.1安裝PHP 5.3.3。

更新

轉載我的生產服務器,這是在CentOS 6.0的「原始」 PHP 5.3.8沒有任何擴展/補丁解決這個問題。

更新2

我設法找到一個「解決辦法」(只有在這個時刻工作)。如果我將絕對日期更改爲:

$start = new DateTime('first day of next month'); 
$end = new DateTime('last day of next month'); 

它確實給0m30d作爲輸出。儘管如此,如果有人對此有所瞭解,請讓我知道!

回答

4

恭喜,您剛剛發現了DST!如果您檢查您的時區的DST切換,您會看到$ start實際上是在2月29日,而$ end是在3月30日。 (2-3)= 1(因此,m = 1)和(29-30)= 1(因此,d = 1)。

+0

非常感謝!這正是問題所在。我調整我的代碼使用'新的DateTime('2012-03-01',新的DateTimeZone('UTC'));'和'新的DateTime('2012-03-31',新的DateTimeZone('UTC')); 「相反,那就是訣竅。 – Oldskool

1

我沒有得到相同的結果,你和我的結果實際上是確定...

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

它的不正常甚至一個月原位缺口得到1個月的原因還存在兩個日期之間,1本月將是

$start = new DateTime('2012-03-01'); 
$end = new DateTime('2012-04-01'); 

什麼,我在這裏看到的是你也許得到了-1天,而是30天1個月,你以爲你鋸1天1個月,或者你得到的代碼是您粘貼在這裏沒有什麼...

你能啓發我們嗎?

感謝

+0

感謝您的回答,只是認爲它應該是0m30d的確如此,因此更新了我的問題。代碼完全**如上面粘貼。 – Oldskool

+0

然後也許升級將有所幫助,我在5.3.6與xdebug 2.1.0 –

+0

我剛剛在我的生產服務器上,這是在不同的操作系統和PHP 5.3.8上測試此代碼,它會產生完全相同的輸出,奇怪的東西:\ – Oldskool

0

this頁(PHP手冊)的評論似乎表明,該功能可以在某些平臺或輸入一定範圍相當馬車。

這可能是您的問題的原因。