2010-12-01 78 views
3

我已经经历了许多时区/ 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.

回答

5

这不会很容易。

首先,考虑一下现有的存储日期是在服务器的本地时间,它遵守夏令时。任何需要对这些日期做任何事的代码,除了现在或将来打印它们之外,都需要首先将它们转换为UTC。如果夏令时规则在存储日期和当前时间(转换发生时)不完全相同,则您的服务器将使用“当前”规则并因此产生错误的结果。当然,这种情况在你的特定情况下可能是牵强的(或者也可能不是),但这是一个非常强烈的警告,用于存储UTC以外的其他任何信息。

假设DST规则保持不变,并且您有PHP> = 5.3.0,你可以这样做:用DateTime::createFromFormat

  1. 读取“原始”数据库日期,明确指定时区(服务器的TZ )
  2. 转换为用户的本地时间与DateTime::setTimezone(指定用户的TZ)
  3. 显示给用户

当接收到用户输入了,你会升需要做反向:

  1. DateTime::createFromFormat创建用户本地时间日期,明确指定时区(用户的TZ)
  2. 转换到服务器本地时间与DateTime::setTimezone(指定服务器的TZ)
  3. 存放在数据库

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

+0

感谢乔恩,这给了我一个开始的好地方,我会尝试并实施您的建议。 – Jason 2010-12-01 16:09:45

1

你可以利用

1)date_default_timezone_set - 设置脚本

2中所有日期/时间函数的默认时区)如果不使用此函数来设置脚本中的默认时区,您还可以使用INI设置date.timezone来设置默认时区。

0

因此,有没有人有任何关于如何使这个应用程序时区知道考虑服务器未设置为UTC的最佳方式的建议?

如果你设法使用任何重新映射时区的方案,它将变得非常复杂,甚至更难以正确地修复。帮你一个忙,并获得服务器时区到UTC并修复你现有的数据。

0

allyou的第一个必须将用户选择的日期时间转换为时间戳

您必须使用服务器时区偏移量并将时间节省到服务器格林尼治标准时间。

这是最好的方式,因为同时显示日期刚才添加的用户

的偏移和转换和显示。

我已经为我的客户实施了这个功能,因为这是一个拍卖网站,用户可以在他的时间内添加AUS项目,竞标者将来自美国。时区问题在那里,我们经过了很多次的实施。

你知道一件事情最好和容易方式是,像ebay。只需保存用户时区并用时区显示时间即可。没有任何转换。简单,更好。10:35 EST :)

如果您想在时区转换中完美无缺,请考虑夏令时。每年的开始日期和结束日期会略有变化。如果你想准确的话,你必须在白天保存日光的开始和结束日期,并添加该差异。:)

1

要记住的重要事项不是UTC,而是存储的所有时间都必须标准化为一个时区。因此,如果您的PHP服务器和数据库服务器都使用相同的时区,则唯一出现的问题是您需要向用户显示位置感知时间,或者允许用户从另一个时区输入日期时间。

PHP有一个不错的,虽然有点文件记录的类,称为DateTime。还有一些辅助类,如DateTimeZone,DateInterval等。这些使得从db时间到用户时间的转换非常简单。