在PHP中处理在不同时区存储/显示日期的最佳方法?

2022-08-30 15:21:07

在过去的几个小时里,我一直在阅读这个话题,我想我已经掌握了它,但我想得到一些确认。

情况

我希望加利福尼亚州的用户能够发布将存储在MySQL中的评论。然后,我希望德克萨斯州的用户能够查看评论,并将发布日期调整为他或她的时区。

建议的解决方案

存储

  1. 在应用程序启动时运行以下命令,以便所有日期函数都使用 UTC 时区:date_default_timezone_set('UTC');
  2. $Date = new DateTime();以获取当前日期和时间(以 UTC 为单位)的 DateTime 对象。
  3. 用于获取要插入到 MySQL 中的日期时间类型列中的值。$Date->format()

显示

  1. 从 JavaScript 获取用户的时区信息,并将其存储在 Cookie 中。
  2. 运行 MySQL SELECT 查询以检索日期时间列值。
  3. $Date = new DateTime($row['time']);以使用存储的 UTC 时间实例化 DateTime 对象。
  4. $Date->setTimezone(new DateTimeZone($userTimezone));将 UTC 时间调整为用户的时区。
  5. 显示使用$Date->format();

这是必须做的要点吗?我是否缺少更好的解决方案?感谢您的帮助!


答案 1

它仍然可以变得更简单。既然你正在使用JavaScript,那么为什么不使用JavaScript来调整客户端上的时区呢?

  1. 将服务器上的所有时间存储为 UTC
  2. 将它们作为 UTC 提供给客户端
  3. 客户端使用 JavaScript 将时间调整为本地时区

这不仅使事情变得更简单,而且还克服了模型的问题。如果我在纽约注册了我的帐户,但前往澳大利亚,我想查看澳大利亚时区的时间。事实上,使用你使用的JavaScript可以很容易地调整设置,使设计更加动态。其次,您可以避免存储用户时区的开销。

也就是说,如果您希望您的设计降级为非JavaScript浏览器,那么您最好采用依赖于HTTP cookie的完整服务器端方法(而不是依靠JS来获取cookie)。


答案 2

你做这一切的权利。将所有日期存储在 UTC(GMT+0) 中,从数据库中检索它们并应用用户的偏移量。

从本质上讲,你已经从头到尾涵盖了所有内容,真的没有什么可添加的,我认为除了你已经做的事情之外,你不能优化它。


推荐