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";
?>
我可以在Windows上使用'PHP 5.4.4'確認此行爲(使用歐洲/柏林'時區) –
我也確認在Ubuntu上使用PHP 5.3.8,同樣的行爲,實際上如果你是'$ date - >修改('+ 1小時');'它會輸出預期的結果。 –
注意:使用'DateTime :: add()'並指定一個適當的'DateInterval'P0D「'不會改變日期。我認爲這是PHP中的一個錯誤,請好好報告一下。 –