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

Php 函数setTimezone更改时区,但不更改日期,php,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,然后再将其存储到数据库中

当我使用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,但日期不变

我在《流浪者》上与Symfony 4合作。 该测试在控制器内部进行 我的时区是否可能都设置为+00? 我可以执行什么样的测试来查找此问题的原因

更新 这将在控制器中返回0的偏移量。 它使用PHPCLI返回3600

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

使用此方法设置时区时,不会修改DateTime对象表示的时间戳值。只有时区以及由此产生的显示格式会受到影响。

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

穿越时区UTC:

$timezone = new \DateTimeZone('UTC');
然后我们需要得到偏移量

$offset = $timezone->getOffset($dt);
最后,使用偏移量修改日期:

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

问题来自tzdata包,该包在更新后运行良好。
我必须重新启动apache才能在我的应用程序中正常工作。

。你的PHP版本和平台是什么?在独立脚本中也会发生这种情况吗?我使用PHP7.3.2。我尝试了php交互模式,但没有成功。更新tzdata包后,该问题在PHP CLI中得到解决,但在我的控制器中仍然不起作用。请阅读此处了解更多信息,返回的偏移量为0,我的日期时间为UTC,我将时区设置为欧洲/Berlin@ga3tan然后尝试将UTC传递给客户,因为上面的代码来自UTC->Europe/Berlin。所以把它倒过来。我将更新上面的代码。不管到目前为止有什么其他的答案,问题中的代码是好的,应该按照预期工作。
$dt->modify($offset . 'seconds');