微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP-错误的时间戳/时区转换

我从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 举报,一经查实,本站将立刻删除。

相关推荐