为不同时区的用户存储特定的日期/时间值

时间:2014-09-05 21:05:56

标签: php mysql codeigniter datetime codeigniter-2

我正在开发一个PHP(CodeIgniter)/ MySQL应用程序,允许用户选择何时发布他们的博客文章。到目前为止我如何设计它的工作原理如下:

  1. 用户在他/她的个人资料中设置时区。
  2. 用户设置博客帖子的发布日期。假设此日期/时间基于用户的时区。
  3. 根据用户的时区,发布日期将转换为UTC(00:00)。
  4. 转换后的日期在mysql中存储为DATETIME。
  5. 服务器经常将存储的DATETIME值转换为服务器时区,并在时间到来时发布内容。
  6. 我想知道是否有更好的方法来处理这种情况,考虑到我的数据库服务器和Web服务器位于云上的不同计算机上,并且可能也会更改位置。

1 个答案:

答案 0 :(得分:1)

由于您正在讨论 future 时间的安排,因此仅存储 UTC并不是最好的方法。

请记住,时区规则可以(并且确实)发生变化。如果您对时区数据应用更新(在PHP中,使用PECL的timezonedb包完成),那么您已转换为UTC的任何数据都可能无效。

更好的解决方案是存储多个值:

  • 原始的本地日期和时间

  • 原始时区(例如"America/New_York"

  • UTC日期和时间,从本地值转换

当您想查看是否有时间运行任务时,您需要将当前的UTC日期和时间与存储的UTC值进行比较。

当您应用时区更新时,您将丢弃以前所有条目的转换UTC值,并根据更新的数据重新计算新值。

如果您不这样做,那么您将失去用户最初提供的意图。如果您不及时更新您的时区数据,那么您的系统将无法了解全球各地发生的各种变化,例如今年早些时候在埃及发生的变化,或者10月份发生的变化对于俄罗斯。

最后一点 - 如果实施得当,服务器的时区应该无关紧要。比较UTC与UTC。