Php Symfony3使用时区的原则

Php Symfony3使用时区的原则,php,mysql,datetime,doctrine-orm,symfony,Php,Mysql,Datetime,Doctrine Orm,Symfony,我刚刚将一个Symfony2.4项目迁移到了Symfony3.0,我面临着一个更严峻的局面 项目的默认时区是UTC,所有内容都作为UTC时间戳存储在MYSQL数据库中 我检索一个名为“checkOut”的datetime字段的条目,并将其传递给twig模板: <p>{{ dump(entity.checkOut) }}</p> <p>{{ dump(entity.checkOut.getTimestamp()) }}</p> 这是正确的 但我的应

我刚刚将一个Symfony2.4项目迁移到了Symfony3.0,我面临着一个更严峻的局面

项目的默认时区是UTC,所有内容都作为UTC时间戳存储在MYSQL数据库中

我检索一个名为“checkOut”的datetime字段的条目,并将其传递给twig模板:

<p>{{ dump(entity.checkOut) }}</p>
<p>{{ dump(entity.checkOut.getTimestamp()) }}</p>
这是正确的

但我的应用程序应该支持来自不同时区的用户。因此,我存储了用户首选的时区,并使用事件侦听器来设置它

date_default_timezone_set($this->token_storage->getToken()->getUser()->getTimezone());
之后,将显示相同的条目:

DateTime {#585 ▼
  +"date": "2016-09-17 10:46:00.000000"
  +"timezone_type": 3
  +"timezone": "Asia/Jakarta"
}
1474083960
这显然是错误的,因为时间戳现在不同了。我希望:

DateTime {#585 ▼
  +"date": "2016-09-17 17:46:00.000000"
  +"timezone_type": 3
  +"timezone": "Asia/Jakarta"
}
1474109160

这在sf2.4中曾经运行良好。有人能解释一下问题是什么以及我如何解决它吗?

这是因为您正在更改服务器的默认时区,而不是更改所讨论的DateTime实例的时区。我的一个宠物讨厌

我不熟悉twig,但这样做会给您带来预期的结果:-

<p>{{ dump(entity.checkOut) }}</p>
<p>{{ dump(entity.checkOut.setTimeZone(new \DateTimeZone("Asia/Jakarta"))) }}</p>
<p>{{ dump(entity.checkOut.getTimestamp()) }}</p>
{{dump(entity.checkOut)}

{dump(entity.checkOut.setTimeZone(new\DateTimeZone(“亚洲/雅加达”))}

{{dump(entity.checkOut.getTimestamp())}


这是因为您正在更改服务器的默认时区,而不是更改相关DateTime实例的时区。我的一个宠物讨厌

我不熟悉twig,但这样做会给您带来预期的结果:-

<p>{{ dump(entity.checkOut) }}</p>
<p>{{ dump(entity.checkOut.setTimeZone(new \DateTimeZone("Asia/Jakarta"))) }}</p>
<p>{{ dump(entity.checkOut.getTimestamp()) }}</p>
{{dump(entity.checkOut)}

{dump(entity.checkOut.setTimeZone(new\DateTimeZone(“亚洲/雅加达”))}

{{dump(entity.checkOut.getTimestamp())}


谢谢您的回答。这确实是一个解决方案,但需要我更新网站上的每个模板。还有一些情况下,例如,我必须获得特定月份的所有记录,在这些情况下,我还应该考虑用户的时区。更改默认时区非常方便,因为所有内容都是根据用户的时区计算的。方便是的,但根据您的体验仍然是错误的。谢谢您的回答。这确实是一个解决方案,但需要我更新网站上的每个模板。还有一些情况下,例如,我必须获得特定月份的所有记录,在这些情况下,我还应该考虑用户的时区。更改默认时区非常方便,因为所有内容都是根据用户的时区计算的。方便是的,但仍然是错误的。