Javascript / PHP和时区

时间:2010-02-23 15:45:41

标签: php javascript timezone

我希望能够猜测用户的时区偏移量以及是否应用了夏令时。目前,我发现的最明确的代码是:

http://www.michaelapproved.com/articles/daylight-saving-time-dst-detect/

所以这给了我与DST指标的偏移量。

现在,我想在我的PHP脚本中使用这些来为用户输出本地日期/时间....但是最好的是什么?我想我有两个选择:

a)从timezone_abbreviations_list()的输出中选择一个具有相同偏移量和DST设置的随机时区。然后用这个调用date_timezone_set(),以便将正确的处理应用到时间。

b)继续将日​​期视为UTC,但只需添加一些时间戳,即可添加适当的小时数。

我的感觉是选项B是最好的方式。这样做的原因是,使用A,我可以使用一个时区虽然在偏移量/ dst方面是正确的,但可能会在场景后面有一些阻碍规则,这可能会产生令人惊讶的结果(尽管如此,我还不知道我认为我不能排除它。)

然后我会在每个会话开始时使用Javascript重新检查时区,以捕获用户的时区更改(非常不可能)或者传入DST时段。

对于大脑转储感到抱歉 - 我真的只是在确认上述方法是有效的。

谢谢,

詹姆斯。

5 个答案:

答案 0 :(得分:7)

使用javascript稳健地确定用户的时区。查看jsTimezoneDetect

它将为您提供一个Olsen时区数据库密钥,您可以将其用于服务器端日期时间计算。

答案 1 :(得分:3)

如果这是民意调查,那么“b”就是我的投票。

首先,所有时间都应以UTC格式存储。这是教条。这是一个非常明智的教条,在你的项目变得更加复杂之后,你最终会说“我当然希望我遵循这一点”。除此之外,它是唯一能够及时存储所有时间点的明确,一致的方式。任何具有夏令时的时区在开关周围都有模糊的时间参考(例如,凌晨1:30通常会发生两次)。此外,在时区之间进行转换时,大多数情况下您最终都会使用UTC作为中介。

其次,您必须决定您的网站是否为国际网站。如果没有,那么您为六个美国时区制定规则并结束它。有三个浏览器以自己的方式报告时间戳,这仍然只有18个案例,应该可以处理它们。除此之外的任何事情,你应该假设它需要一个高级学位来预测夏令时差异。时间在不同的地方转换。

b的最大问题是,如果这是一个类似日历的应用程序,如果您无法准确确定某人所在的时区,则调度仍然是一个问题。例如,假设它是二月份。 DST上没有人。有人会在5月5日下午6点(本地)安排一些事情。你会看到偏移量是UTC-4。你怎么知道那个人是否在新不伦瑞克省观察DST(在这种情况下意味着的时间是2100 UTC),或波多黎各没有(在这种情况下时间意味着是2200 UTC?这是一个棘手的问题。This post可能有一些帮助。

答案 2 :(得分:1)

如果您想依赖javascript,您只需来回发送utc时间/时间戳,让客户将其转换为本地时间表示。

编辑:简单的自包含示例(使用jquery)

<html>
  <head>
    <title>...</title>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript">
      function foo(){
        $('.time').each( function() {
          var t = $(this);
          var d = new Date(Date.parse(t.text()));
          t.text(d.toLocaleString());
        });
      }
    </script>
  </head>
  <body>
    <div class="time"><?php echo gmdate(DateTime::RFC1123); ?></div>
    <button onclick="foo()">local time</button>
  </body>
</html>

如果javascript不可用,用户仍会看到日期/时间,但它是UTC格式 edit2:还有一个javascript库(或者它甚至是一个jquery插件?)做了这样的事情加上一些漂亮的转换,比如“一小时前”,“上周”......就像那样。但我忘了这个名字:(

答案 3 :(得分:1)

我认为如果不知道确切的时区,总会有机会错过一些模糊的规则。
与大多数国际化问题一样,规则比您预期的更为模糊。

然而,我会选择A:“选择一个具有正确偏移的可能时区”,因为时区的东西往往比你想象的更复杂。特别是考虑到夏令时的变化时。如果你选择选项A,你可以使用PHP提供的标准函数。

您可以将其与其他指标相结合,以提高预测质量;例如:

  • 根据访客统计数据:选择大多数访客来自的时区;
  • 基于accept_headers:将语言与时区匹配;
  • 基于IP地理位置:在正确的时区内与国家/地区匹配。

结合上述内容应该给出一个非常合理的估计。但是,100%的确定性无法实现。

答案 4 :(得分:1)

请参阅此替代方案: https://stackoverflow.com/a/12682439/1691517

检测90个时区,在测试平台上具有100%的准确度。