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'));

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...