我经历了很多时区/ 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。
答案 0 :(得分:5)
这不是一件容易的事。
首先,请考虑现有存储日期是服务器的本地时间,这可以观察夏令时。除了现在或将来打印它们之外,任何必须对这些日期执行任何操作的代码都需要先将它们转换为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)。
答案 1 :(得分:1)
您可以使用
1)date_default_timezone_set - 设置脚本中所有日期/时间函数使用的默认时区
2)您也可以使用INI设置date.timezone来设置默认时区,而不是使用此功能在脚本中设置默认时区。
答案 2 :(得分:1)
要记住的重要事项不是UTC,而是存储的所有时间必须标准化为一个时区。因此,如果您的PHP服务器和数据库服务器都使用相同的时区,则唯一的问题是当您需要向用户显示位置感知时间或允许用户从其他时区输入日期时间时。 / p>
PHP有一个很好的,虽然有点记录的类,称为DateTime。还有一些辅助类,如DateTimeZone,DateInterval等。这些使得从db时间到用户时间的转换变得非常简单。
答案 3 :(得分:0)
因此,如果服务器未设置为UTC,那么有没有人对如何使应用程序时区有所了解的最佳方法有任何建议?
如果你设法重新安装时区,那么它将变得非常复杂,甚至无法正确修复。帮自己一个忙,让服务器时区达到UTC并修复现有数据。
答案 4 :(得分:0)
首先,你必须将用户选择的日期时间转换为时间戳。
您必须使用服务器时区偏移,并将时间保存到GMT中的服务器。
这是最好的方法,因为显示日期时只需添加用户的偏移量
并转换并显示。
我已经为我的客户实施了这个,因为它是一个拍卖网站,用户可以在他的时间添加来自AUS的商品,并且投标人将来自美国。时区问题就在那里,我们在经过大量的报道后实施了。
你知道最好的一件事,而且简单的方式就像 ebay 一样。只需保存用户时区并显示时区。没有任何转换。简单而且更好。美国东部时间10:35:)
如果您想要完美的时区转换,请考虑夏令时。每年的开始日期和结束日期将略有变化。如果你想要准确,你必须在db中保存日光开始和结束日期,并添加这个差异。:)
答案 5 :(得分:0)
要在不同的时区和格式中使用datetime,您可以尝试使用PHP库Dater(https://github.com/barbushin/dater)。干杯!