微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 管理时区

我已经浏览了很多时区/ PHP帖子,大多数建议以UTC格式存储您的日期时间字段,然后在存储和显示日期时间信息时使用应用程序用户时区偏移量.

我遇到的问题我继承了一个不是时区感知的应用程序,现在我需要迎合这个问题.

服务器已设置为“EST 11:00 Australia / Melbourne”,并且已经有从该服务器运行的应用程序.所以我无法改变这一点.

幸运的是,我知道用户的时区偏移,即-05:00等.

该应用程序使用Javascript日期并使用PHP的strtotime()函数解析它们并存储在MysqL数据库中,如下所示:

$event_starts = date('Y-m-d H:i:s', 
    strtotime('Thu Dec 02 2010 11:15:00 GMT+1100 (AUS Eastern Daylight Time)');

因此,如果服务器未设置为UTC,那么有没有人对如何使这个应用程序时区有所了解的最佳方法有任何建议?

非常感谢,J.

解决方法:

这不是一件容易的事.

首先,请考虑现有存储日期是服务器的本地时间,这可以观察夏令时.除了现在或将来打印它们之外,任何必须对这些日期执行任何操作的代码都需要先将它们转换为UTC.如果夏令时规则在存储日期的时间点和当前时间(转换发生时)不完全相同,则服务器将使用“当前”规则,从而产生错误的结果.当然,这种情况在你的特定情况下可能是牵强附会的(或者可能不是这样),但是对于存储除UTC之外的任何东西,这是一个非常强烈的警告.

假设DST规则保持不变,并且您有PHP> = 5.3.0,则可以执行以下操作:

>使用DateTime :: createFromFormat读取“原始”数据库日期,显式指定时区(服务器的TZ)
>使用DateTime :: setTimezone(指定用户的TZ)转换为用户本地时间
>向用户显示

接收用户输入时,您需要执行相反的操作:

>使用DateTime :: createFromFormat创建用户本地时间日期,显式指定时区(用户的TZ)
>使用DateTime :: setTimezone(指定服务器的TZ)转换为服务器本地时间
>存储在数据库

除了上述内容之外,我建议您在某个时候使应用程序脱机并将数据库中的所有日期转换为UTC.然后你就可以摆脱前面讨论过的问题(至少在未来,因为过去无法撤消).我上面提到的“服务器的TZ”将是UTC(无论实际服务器是否设置为AUS EDT,您的“工作”时区将是UTC).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐