我的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);
($date
为1466546400
)
输出
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会在冬季仍然正确吗?
答案 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'));