您好我的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
答案 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