我从MySQL数据库中获取了一个DateTime,并使用Twig将其转换为Unix TimeStamp:
在DB中:2016-06-22 00:00:00
在Twig中作为时间戳记: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在冬季仍然正确吗?
解决方法:
问题出在以下事实:createFromFormat()在设计上忽略了它的第三个参数(时区):
Note: The timezone parameter and the current timezone are ignored
when the time parameter either contains a UNIX timestamp (e.g.
946684800) or specifies a timezone (e.g. 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'));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。