2012-08-22 76 views
6

任何人都可以詳細說明爲什麼以下DateTime->modify()代碼會產生這些奇怪的矛盾結果,這取決於PHP版本(它是一個錯誤? )。「DateTime-> modify('+ 0 days')」修改日期時間對象

我期望所有的例子都能產生相同的日期和時間的對象創建,但這顯然不是這種情況。

似乎工作的唯一例子是中間那個從UNIX時間戳創建DateTime對象的地方,以及後來設置時區的地方(在施工時無法設置,因爲它將被忽略)。

PHP 5.4.4和5.4.6:

FROM TIMESTAMP, NO TZ: 
2012-08-21 22:00:00 GMT+0000 (offset 0) <-- different 
2012-08-21 23:00:00 GMT+0000 (offset 0) <-- from this 
FROM TIMESTAMP, WITH TZ: 
2012-08-22 00:00:00 CEST (offset 7200) 
2012-08-22 00:00:00 CEST (offset 7200) 
FROM STRING: 
2012-08-22 00:00:00 CEST (offset 7200) 
2012-08-22 00:00:00 CEST (offset 7200) 

PHP 5.2.0:

FROM TIMESTAMP, NO TZ: 
2012-08-21 22:00:00 GMT+0100 (offset 7200) 
2012-08-21 22:00:00 GMT+0100 (offset 7200) 
FROM TIMESTAMP, WITH TZ: 
2012-08-22 00:00:00 CEST (offset 7200) 
2012-08-22 00:00:00 CEST (offset 7200) 
FROM STRING: 
2012-08-22 00:00:00 CEST (offset 7200) <-- different 
2012-08-21 23:00:00 CEST (offset 7200) <-- from this 

代碼:

<?php 
    $tz = new DateTimeZone('Europe/Berlin'); 

    echo "FROM TIMESTAMP, NO TZ:\n"; 

    $date = new DateTime('@'.strtotime('2012-08-22 00:00:00 CEST')); 
    echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; 

    $date->modify('+0 days'); 
    echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; 

    echo "FROM TIMESTAMP, WITH TZ:\n"; 

    $date = new DateTime('@'.strtotime('2012-08-22 00:00:00 CEST')); 
    $date->setTimezone($tz); 
    echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; 

    $date->modify('+0 days'); 
    echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; 

    echo "FROM STRING:\n"; 

    $date = new DateTime('2012-08-22 00:00:00 CEST', $tz); 
    echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; 

    $date->modify('+0 days'); 
    echo $date->format('Y-m-d H:i:s T').' (offset '.$date->getOffset().")\n"; 
?> 
+0

我可以在Windows上使用'PHP 5.4.4'確認此行爲(使用歐洲/柏林'時區) –

+0

我也確認在Ubuntu上使用PHP 5.3.8,同樣的行爲,實際上如果你是'$ date - >修改('+ 1小時');'它會輸出預期的結果。 –

+1

注意:使用'DateTime :: add()'並指定一個適當的'DateInterval'P0D「'不會改變日期。我認爲這是PHP中的一個錯誤,請好好報告一下。 –

回答

2

DateTime::add()使用和指定適當DateInterval "P0D"沒有按」改變日期。我認爲這是PHP中的一個錯誤,請好好報告一下。