我正在使用Symfony3开发一个Web应用程序,并希望将其传播到世界各地。但我想知道它在不同的时区管理方面是如何运作的。
我在网上寻找这个问题的答案,并在几天后进行了大量的测试。他们都没有工作。
有人有一个神奇的解决方案吗?
我已经了解了像camroncade这样的助手。但这只是转换php时间。 我希望能够直接在SQL中转换时间
我在我的数据库中保存UTC中的所有时间戳。
我有两个想法,但两个都没有用:
1st:创建存储函数convert_tz(timestamp,from,to),并在我想保存或显示时间戳时在所有SQL查询中调用它。 但Symfony无法做到这一点。
第二:告诉mysql用户会话对应的时区,mysql会自动转换为正确的时间。人们告诉我mysql可以做到这一点,但是我没有找到任何关于如何从Symfony告诉mysql的方法。
答案 0 :(得分:1)
我认为他们说时区仅应设置为显示目的是错误的。在某些时区进行操作很重要,这样可以避免DST更改发生问题。
示例:
$date1 = new DateTime('2019-08-05 18:00:00', new DateTimeZone('Europe/Warsaw'));
$date2 = new DateTime('2019-08-05 18:00:00', new DateTimeZone('Europe/Warsaw'));
var_dump($date1);
var_dump($date2);
$date2->setTimeZone(new DateTimeZone('UTC'));
$date1->modify('+5 months');
$date2->modify('+5 months');
$date2->setTimeZone(new DateTimeZone('Europe/Warsaw'));
var_dump($date1);
var_dump($date2);
初始日期相等。然后将其中一个转换为UTC,并在两个日期执行相同的操作。最后,日期转换回欧洲/华沙,您意识到$date2
现在比$date1
晚1小时。
答案 1 :(得分:0)
这可能更像是一个Doctrine / Database问题。从Doctrine项目中检查Working With DateTime Instances。
使用日期时间类型处理不同的时区
如果您第一次遇到保存不同时区的要求 你可能仍然对如何处理这个混乱感到乐观,但让 我快速粉碎你的期望。没有一个数据库了 那里(由Doctrine 2支持)正确支持时区
[...]
然而,解决方法甚至允许正确的日期时间 处理时区:
- 始终将任何DateTime实例转换为UTC。
- 仅为显示目的设置时区
- 将时区保存在实体中以保持持久性。
所以它可能但不是那么直接。
在我们的某个应用中,我们会在特定时间向不同时区的用户发送电子邮件和推送通知。在数据库中进行查询时,我们始终会考虑用户的时区。