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

时间:2009-02-05 22:36:15

标签: php mysql datetime date timezone

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

场合

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

提议的解决方案

贮藏

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

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

      这是必须做的事情的要点吗?我错过了更好的解决方案吗?谢谢你的帮助!

2 个答案:

答案 0 :(得分:14)

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

  1. 以UTC格式
  2. 在服务器上存储所有时间
  3. 以UTC格式向客户提供服务
  4. 客户端使用JavaScript调整本地时区的时间
  5. 这不仅使事情变得更简单,而且还克服了模型的问题。如果我在纽约注册我的帐户但是前往澳大利亚,我希望看到澳大利亚时区的时间。事实上,使用您使用的JavaScript可以轻松调整设置,使设计更加动态。其次,您可以避免存储用户时区的开销。

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

答案 1 :(得分:3)

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

基本上,你从头到尾都覆盖了这一切,没有什么可以补充的,我认为你不能超越你已经做的那样优化它。