函数setTimezone更改时区,但不更改日期

时间:2019-02-18 14:22:26

标签: php

我正在尝试将日期的时区从欧洲/柏林更改为 UTC ,然后再将其存储到数据库中。

当我使用 DateTime 对象的 setTimezone()方法时,它会更改timezone属性,但不会更改日期本身。

示例代码:

$dt = new \DateTime();
var_dump($dt);

$dt->setTimezone(new \DateTimeZone('Indian/Comoro'));
var_dump($dt);

$dt->setTimezone(new \DateTimeZone('UTC'));
var_dump($dt);

结果:

object(DateTime)#1479 (3) { ["date"]=> string(26) "2019-02-18 14:12:37.521579" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Europe/Berlin" }

object(DateTime)#1479 (3) { ["date"]=> string(26) "2019-02-18 14:12:37.521579" ["timezone_type"]=> int(3) ["timezone"]=> string(13) "Indian/Comoro" }

object(DateTime)#1479 (3) { ["date"]=> string(26) "2019-02-18 14:12:37.521579" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" }

柏林是UTC + 1,科摩罗是UTC + 3,但是日期没有改变。

我正在使用 Vagrant 上的 Symfony 4 。 该测试是在控制器内部进行的 我的时区是否都可能设置为+00? 我可以实施哪种测试来找到此问题的原因?

更新 这使我在控制器中的偏移量为0。 使用php CLI返回3600。

$tz = new \DateTimeZone('Europe/Berlin');
var_dump($tz->getOffset(new \DateTime('now', new \DateTimeZone('UTC'))));

3 个答案:

答案 0 :(得分:2)

问题出在更新后的tzdata软件包中。 我必须重新启动apache才能使其在我的应用中正常工作。

答案 1 :(得分:0)

使用此方法设置时区时,不会修改DateTime对象表示的时间戳值。仅会影响时区,并因此影响显示格式。

答案 2 :(得分:0)

尝试一下(假设日期默认设置为欧洲/柏林时区):

$dt = new \DateTime();

通过时区UTC:

$timezone = new \DateTimeZone('UTC');

然后我们需要获取偏移量。

$offset = $timezone->getOffset($dt);

最后,使用偏移量修改日期:

$dt->modify($offset . 'seconds');