2016-09-27 29 views
0

我刚刚将一个Symfony2.4项目迁移到Symfony3.0,我面临着一个奇怪的情况。Symfony3使用时区的原则

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

我检索与名为 'Checkout' 日期时间字段中的项,将它传递给树枝模板:

<p>{{ dump(entity.checkOut) }}</p> 
<p>{{ dump(entity.checkOut.getTimestamp()) }}</p> 

我也得到:

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

这是正确的。

但我的应用程序应该支持来自不同时区的用户。所以我存储用户的首选时区和使用事件侦听器来设置它

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罚款。任何人都可以解释问题是什么,我该如何解决它?

回答

3

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

我不熟悉的树枝,但是做这样的事情会得到预期的结果: -

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

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

+0

方便是的,但仍然错误,因为你正在经历。 – vascowhite