我正在开发一个 PHP(CodeIgniter)/MySQL 应用程序,它允许用户选择何时发布他们的博客文章。到目前为止,我是如何设计它的工作方式如下:
- 用户在他/她的个人资料中设置时区。
- 用户设置博客文章的发布日期。假定此日期/时间基于用户的时区。
- 根据用户的时区,将发布日期转换为 UTC (00:00)。
- 转换后的日期在 mysql 中存储为 DATETIME。
- 服务器经常将存储的 DATETIME 值转换为服务器时区,并在时间到时发布内容。
我想知道是否有更好的方法来处理这种情况,考虑到我的数据库服务器和网络服务器在云端的不同机器上,并且可能也会改变位置。
最佳答案
由于您在谈论 future 时间的安排,因此仅存储UTC不一定是最佳方法。
请记住,时区规则可以(并且确实)会发生变化。如果您对时区数据应用更新(在 PHP 中,它是通过 PECL 的 timezonedb 包完成的),那么您已经转换为 UTC 的任何数据都可能无效。
更好的解决方案是存储多个值:
原始本地日期和时间
原始时区(例如
“America/New_York”
)从本地值转换的 UTC 日期和时间
当您想查看是否到了运行任务的时间时,您可以将当前 UTC 日期和时间与存储的 UTC 值进行比较。
当您应用时区更新时,您将丢弃所有 future 条目的先前转换的 UTC 值,并根据更新后的数据重新计算新值。
如果您不这样做,那么您将失去用户最初提供的意图。而且,如果您不及时更新时区数据,那么您的系统将不会意识到世界各地发生的各种变化,例如今年早些时候埃及发生的变化,或俄罗斯 10 月即将发生的变化。
最后一点 - 如果实现得当,您服务器的时区应该无关紧要。将 UTC 与 UTC 进行比较。
关于php - 为不同时区的用户存储特定的日期/时间值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25693970/