我正在尝试将日期的时区从欧洲/柏林更改为 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'))));
答案 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');