2009-02-05 27 views
29

我在过去的几个小时里一直在阅读这个话题,我想我已经掌握了它,但我想要一些确认。在PHP中处理不同时区中存储/显示日期的最佳方法?

形势

我想,说,加州用户能够发布将存储在MySQL评论。然后,我希望德克萨斯州的用户能够查看评论,并根据他或她的时区调整发布日期。

建议的解决方案

存储

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

显示

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

那是有感而发的要点做?我错过了更好的解决方案吗?谢谢你的帮助!

回答

14

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

  1. 商店一直在服务器上为UTC
  2. 为他们服务的客户为UTC
  3. 客户端使用JavaScript调整时间,本地时区

这不仅让事情变得简单,但它也克服了你的模型的问题。如果我在纽约注册帐户但前往澳大利亚,我希望按照澳大利亚时区查看时间。实际上,使用JavaScript可以轻松调整设置,使设计更加动态。其次,您可以避免存储用户时区的开销。也就是说,如果你希望你的设计降级到非JavaScript浏览器,那么你最好采用一个依赖于HTTP cookie的完整服务器端方法(而不是依靠JS来获取cookie)。

+0

我想我会在用户登录时设置时区cookie,因此如果您前往澳大利亚并从那里登录,它应该会更新。 您是否建议在页面加载时运行一些JavaScript,例如查找中的时间并将它们全部转换为实时? – 2009-02-05 23:47:33

3

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

从本质上讲,你已经从头到尾都覆盖了所有内容,没有什么需要补充的,我不认为你可以优化它超出你已经做的。

+0

我同意,这是我会做的。 – Ross 2009-02-05 22:44:48

相关问题