";日期时间->;修改(';+0天';)”;修改DateTime对象


"DateTime->modify('+0 days')" Modifies DateTime Object

有人能详细解释一下为什么下面的DateTime->modify()代码会产生这些奇怪的矛盾结果,这取决于PHP版本(它是bug吗?在哪个PHP版本中?)。

我希望所有的例子都能产生相同的对象创建日期和时间,但事实显然并非如此。

唯一有效的例子是中间的一个例子,其中DateTime对象是从UNIX时间戳创建的,然后设置时区(不能在构造时设置时区,因为这将被忽略)。

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";
?>

使用DateTime::add()并指定适当的DateInterval "P0D"不会更改日期。我认为这是PHP中的一个错误,请友好地报告它。