PHP \ DateTime vs date()DST转换错误?

时间:2017-01-12 20:52:13

标签: php date datetime dst

您好我的PHP日期时间有问题。

考虑以下脚本:     

  date_default_timezone_set("Europe/Paris");
  echo $tz = date_default_timezone_get();
  echo "\n";

  $dt = new \DateTime("2017-10-29 00:00:00");
  $i = (int)$dt->format('U');
  $i_max = $i + 3600*5;
  for(; $i < $i_max ; $i+=3600){
        $dt = new \DateTime();
        $dt->setTimezone(new \DateTimeZone($tz));
        $dt->setTimestamp($i);

        echo $i."\n";
        echo $dt->format('c T e')."\n";
        echo date('c T e', $i)."\n";
        echo "\n";
  } 

它通过10月法国夏令时在5“小时”时间戳之间循环。 然后它显示ISO8601中的日期及其时区标识符和缩写。

结果如下:

Europe/Paris

1509228000
2017-10-29T00:00:00+02:00 CEST Europe/Paris
2017-10-29T00:00:00+02:00 CEST Europe/Paris

1509231600
2017-10-29T01:00:00+02:00 CEST Europe/Paris
2017-10-29T01:00:00+02:00 CEST Europe/Paris

1509235200
2017-10-29T02:00:00+01:00 CET Europe/Paris
2017-10-29T02:00:00+02:00 CEST Europe/Paris

1509238800
2017-10-29T02:00:00+01:00 CET Europe/Paris
2017-10-29T02:00:00+01:00 CET Europe/Paris

1509242400
2017-10-29T03:00:00+01:00 CET Europe/Paris
2017-10-29T03:00:00+01:00 CET Europe/Paris

查看第3次迭代,DateTime-&gt; format()和date()之间的结果不同。

DateTime显示了这个:

2017-10-29T02:00:00 + 01:00 CET欧洲/巴黎

但它应该显示与date()相同的东西:

2017-10-29T02:00:00 + 02:00 CEST欧洲/巴黎

我的错误在哪里?

- 编辑 -

嗨,这是另一个直接指向“bug”的脚本:

date_default_timezone_set("Europe/Paris");

$dt = new \DateTime();
$dt->setTimestamp(1509235200);
echo $dt->format('c T e')."\n";

echo date('c T e', 1509235200)."\n";

显示:

2017-10-29T02:00:00+01:00 CET Europe/Paris
2017-10-29T02:00:00+02:00 CEST Europe/Paris

并应显示:

2017-10-29T02:00:00+02:00 CEST Europe/Paris
2017-10-29T02:00:00+02:00 CEST Europe/Paris

1 个答案:

答案 0 :(得分:0)

我认为与PHP bug 74274相关的不一致。问题是DateTime在这种情况下工作错误。很明显,如果你将运行该代码:

date_default_timezone_set("Europe/Paris");
$timestamp = 1509235200;
$dt = new \DateTime();
$dt->setTimestamp($timestamp);
echo $timestamp."\n";
echo $dt->getTimestamp()."\n";

会打印

1509235200
1509238800