Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/474.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript/PHP和时区_Php_Javascript_Timezone - Fatal编程技术网

Javascript/PHP和时区

Javascript/PHP和时区,php,javascript,timezone,Php,Javascript,Timezone,我希望能够猜测用户的时区偏移,以及是否应用了夏令时。目前,我找到的最权威的代码如下: 这给了我偏移量和DST指示器 现在,我想在我的PHP脚本中使用它们,以便为用户输出本地日期/时间……但是什么是最好的呢?我想我有两个选择: a) 从时区缩写词列表()的输出中选择具有相同偏移量和DST设置的随机时区。然后使用此函数调用date\u timezone\u set(),以便对时间进行正确的处理 b) 继续将日期视为UTC,但只需添加一些时间戳,以在上添加适当的小时数 我的感觉是B选项是最好的方式。

我希望能够猜测用户的时区偏移,以及是否应用了夏令时。目前,我找到的最权威的代码如下:

这给了我偏移量和DST指示器

现在,我想在我的PHP脚本中使用它们,以便为用户输出本地日期/时间……但是什么是最好的呢?我想我有两个选择:

a) 从时区缩写词列表()的输出中选择具有相同偏移量和DST设置的随机时区。然后使用此函数调用date\u timezone\u set(),以便对时间进行正确的处理

b) 继续将日期视为UTC,但只需添加一些时间戳,以在上添加适当的小时数

我的感觉是B选项是最好的方式。原因是,对于A,我可以使用一个时区,虽然在偏移量/dst方面是正确的,但在场景背后可能有一些模糊的规则,可能会产生令人惊讶的结果(我不知道任何规则,但我认为我不能排除)

然后,我会在每次会话开始时使用Javascript重新检查时区,以便捕获用户的时区何时发生变化(可能性很小)或何时进入DST时段

很抱歉,我的大脑被甩了——我真的只是在得到某种保证,上面的方法是有效的之后

谢谢

詹姆斯。

如果这是一次投票,那么“b”是我的选票

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

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


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

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

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


...
函数foo(){
$('.time')。每个(函数(){
var t=$(本);
var d=新日期(Date.parse(t.text());
t、 文本(d.tolocalstring());
});
}
当地时间
如果javascript不可用,用户仍然可以看到日期/时间,尽管它是UTC格式的。

edit2:还有一个javascript库(或者它甚至是一个jquery插件?)可以做这类事情,再加上一些漂亮的转换,比如“一小时前”、“上周”。诸如此类。但我忘了它的名字:(

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

然而,我会选择选项A:“选择一个具有正确偏移量的可能时区”,这正是因为时区的内容往往比您预期的更复杂。特别是当您考虑夏时制的变化时。如果选择选项A,您可以使用PHP提供的标准函数

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

  • 根据游客统计:选择游客最多的时区
  • 基于accept_头:将语言与时区匹配
  • 基于IP地理位置:在正确的时区与国家匹配

结合以上内容,应该可以给出一个相当合理的估计。但无法实现100%的确定性。

要使用javascript可靠地确定用户的时区,请检查


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

另请参见此备选方案:


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

你好,大卫,非常感谢你的回复。你关于日程安排的观点在这里引发了很多对话,非常感谢。现在请查看该链接……詹姆斯。
<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>