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

标签 php mysql codeigniter datetime codeigniter-2

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

  1. 用户在他/她的个人资料中设置时区。
  2. 用户设置博客文章的发布日期。假定此日期/时间基于用户的时区。
  3. 根据用户的时区,将发布日期转换为 UTC (00:00)。
  4. 转换后的日期在 mysql 中存储为 DATETIME。
  5. 服务器经常将存储的 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/

相关文章:

c# - PHP MD5与C#MD5不匹配

PHP注册/登录系统问题

php - 如何在 CodeIgniter 4 中访问 Stripe

mysql - 我们如何在事件记录中进行多重连接 Codeigniter

javascript - 将图像上传到 MySQL 数据库的正确方法是什么?

php - 如何使用php同时提交文本和图片?

php - 使用 AuthType Basic 登录后的 .htaccess 500 错误

EC2 上的 MySQL 镜像

MySql插入具有触发器的表时出现错误1054

php - 如何使用 php 的 password_hash() 方法..?