错误的时间戳/时区转换

时间:2016-06-23 15:13:57

标签: php mysql symfony date datetime

我的MySQL数据库有一个DateTime,我用Twig转换为Unix TimeStamp:

在DB中2016-06-22 00:00:00

在Twig中作为TimeStamp dbEntry.start|date('U') ==> 1466546400

在Twig中作为日期 dbEntry.start|date('Y-m-d H:i) ==> 2016-06-22 00:00

仔细检查此时间戳http://www.gaijin.at/olsutc.php表示时间戳是本地时间。

我通过AjaxCall将此时间戳发送到我的后端,发生这种情况:

$dateDB = \DateTime::createFromFormat('U',$date)->format('Y-m-d H:i');
dump($dateDB);

$date1466546400

输出

2016-06-21 22:00

在我的所有php.ini个文件中,我将时区设置为Europe/Berlin,但结果时间戳明显为UTC。甚至用

手动设置时区
$dateDB = \DateTime::createFromFormat('U',$date,new \DateTimeZone('Europe/Berlin'))->format('Y-m-d H:i');
    dump($dateDB);

也会导致2016-06-21 22:00

除了php.ini文件之外,这是怎么发生的?我在哪里可以开始寻找它?

旁注

我看到这里的地址PHP timestamps & timezone configuration也是如此,我可以手动添加7200秒,但由于DailightSavingTime会在冬季仍然正确吗?

1 个答案:

答案 0 :(得分:3)

问题来自于createFromFormat()在设计上忽略了它的第三个参数(时区)这一事实:

  

注意: timezone 参数和当前时区将被忽略   当 time 参数包含UNIX时间戳时(例如,   946684800)或指定时区(例如2010-01-28T15:00:00 + 02:00)。

这是一个更清洁的测试案例:

$dt = new DateTime('2016-06-22 00:00:00', new DateTimeZone('Europe/Berlin'));
$dt2 = DateTime::createFromFormat('U', $dt->getTimestamp(), new \DateTimeZone('Europe/Berlin'));
var_dump($dt->format('c'), $dt2->format('c'));
string(25) "2016-06-22T00:00:00+02:00"
string(25) "2016-06-21T22:00:00+00:00"

此处,您需要事后更改时区(默认时区仅在没有时区信息时使用):

$dt2->setTimeZone(new DateTimeZone('Europe/Berlin'));