有人能详细解释一下为什么下面的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中的一个错误,请友好地报告它。