【问题标题】:Javascript/PHP and timezonesJavascript/PHP 和时区
【发布时间】:2011-01-20 03:20:08
【问题描述】:

我希望能够猜测用户的时区偏移量以及是否正在应用夏令时。目前,我为此找到的最权威的代码在这里:

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 期间。

对于脑残,我真的很抱歉——我真的只是在确信上述方法是有效的之后。

谢谢,

詹姆斯。

【问题讨论】:

    标签: php javascript timezone


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      其次,您必须确定您的网站是否国际化。如果不是,那么您为美国六个时区制定规则并结束它。三个浏览器以它们自己古怪的方式报告时间戳,这仍然只有 18 种情况,应该可以处理它们。除此之外,您应该假设它需要高级学位才能预测夏令时差异。时间在不同的地方在不同的日子切换。

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

      【讨论】:

      • 嗨大卫,非常感谢您的回复。你关于日程安排的观点在这里引发了很多讨论,非常感谢。现在查看该链接......詹姆斯。
      【解决方案3】:

      如果您想依赖 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 插件?),它可以做这种事情加上一些漂亮的转换,比如“一个小时前”、“上周”……类似的东西。但是我忘记了名字:(

      【讨论】:

        【解决方案4】:

        我认为,在不知道确切时区的情况下,您总会有机会错过一些晦涩难懂的规则。
        与大多数国际化问题一样,规则往往比您预期的要多。

        但是,我会选择选项 A:“选择具有正确偏移的可能时区”,因为时区的内容往往比您预期的要复杂。特别是当您考虑夏令时更改时。如果选择选项 A,则可以使用 PHP 提供的标准函数。

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

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

        结合以上应该给出一个相当合理的估计。但不能达到 100% 的确定性。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2011-03-29
            • 1970-01-01
            • 1970-01-01
            • 2011-08-11
            • 1970-01-01
            • 2014-11-27
            • 2012-03-21
            相关资源
            最近更新 更多