【问题标题】:How to get client's timezone? [duplicate]如何获取客户的时区? [复制]
【发布时间】:2010-12-26 16:45:33
【问题描述】:

我正在使用 Zend_Framework 编写应用程序(因此解决方案可以依赖它)。

如何获取客户端的时区?

例如,如果有人在俄罗斯莫斯科,我想得到 3*60*60(因为有 UTC+3)。如果他在英国,我想要零。如果他使用 UTC-3:30(加拿大?),我想要 -3.5*60*60。

(这不是关于格式的问题 - 我可以为俄罗斯圣彼得堡获得“欧洲/莫斯科”或“UTC-3”,而是让客户使用时区。但以秒为单位的增量是首选)

想到的唯一解决方案是让 javascript 为我获取本地时间并重定向。

【问题讨论】:

  • 注意,这个问题中的所有答案都是有缺陷的,因为它们只得到 current 偏移量。请参阅the timezone tag wiki 中的“时区!= 偏移量”,并查看 dup 问题及其答案。

标签: php zend-framework timezone


【解决方案1】:

检查 this article on how to detect the timezone 通过 JavaScript 设置一个 Cookie 来保存客户端的时区。它相当冗长,但那是因为它非常冗长。我已经在我自己的一个应用程序中按照这些思路实现了一个解决方案,并且效果很好。

您还可以通过 Ajax 将时区发送到服务器,然后让它执行您需要执行的任何操作。或者,如果您不使用它进行任何服务器端计算,只需在需要的地方应用时区客户端。真的取决于你的用例。

除此之外,我建议你让访问者自己设置他的时区,并将其存储在 Cookie 或 Session 中。

【讨论】:

【解决方案2】:

这是一个开销很小的 cookie 解决方案:

  echo <<<EOE
   <script type="text/javascript">
     if (navigator.cookieEnabled)
       document.cookie = "tzo="+ (- new Date().getTimezoneOffset());
   </script>
EOE;
  if (!isset($_COOKIE['tzo'])) {
    echo <<<EOE
      <script type="text/javascript">
        if (navigator.cookieEnabled) document.reload();
        else alert("Cookies must be enabled!");
      </script>
EOE;
    die();
  }
  $ts = new DateTime('now', new DateTimeZone('GMT'));
  $ts->add(DateInterval::createFromDateString($_COOKIE['tzo'].' minutes'));

【讨论】:

【解决方案3】:

我使用 jQuery 和 PHP 编写了一个函数。这是经过测试的,并且确实有效!

在您希望将时区作为变量的 PHP 页面上,将这段 sn-p 代码放在页面顶部附近的某处:

<?php    
    session_start();
    $timezone = $_SESSION['time'];
?>

这将读取我们现在要创建的会话变量“time”。

在同一个页面中,你需要首先包含jQuery:

<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>

同样在 jQuery 下方,粘贴以下内容:

<script type="text/javascript">
    $(document).ready(function() {
        if("<?php echo $timezone; ?>".length==0){
            var visitortime = new Date();
            var visitortimezone = "GMT " + -visitortime.getTimezoneOffset()/60;
            $.ajax({
                type: "GET",
                url: "http://domain.com/timezone.php",
                data: 'time='+ visitortimezone,
                success: function(){
                    location.reload();
                }
            });
        }
    });
</script>

您可能注意到也可能没有注意到,但您需要将 url 更改为您的实际域。

最后一件事。您可能想知道 timezone.php 到底是什么。嗯,就是这样: (创建一个名为 timezone.php 的新文件并用上面的 url 指向它)

<?php
    session_start();
    $_SESSION['time'] = $_GET['time'];
?>

如果这工作正常,它将首先加载页面,执行 JavaScript,然后重新加载页面。然后,您将能够读取 $timezone 变量并随意使用它!它返回当前的 UTC/GMT 时区偏移量 (GMT -7) 或您所在的任何时区。

【讨论】:

  • 混合javascript和php代码?你是认真的吗?
  • 为什么不呢?除非我弄错了,时区只能从客户端声明,并且在 php 会话中添加了很多灵活性。
  • 是的,ofc,您需要 javascript 来执行此操作。但我说的是把纯 php 嵌入到 html 中:这是猴子编码。更好地使用模板。如果我做这样的事情,我第二天就会被解雇:)
  • 模板引擎在某些时候将您的模板代码转换为直接的 php。
  • 根据Wikipedia,很少有区域与 UTC 有 30 或 45 分钟的偏移(例如纽芬兰标准时间是 UTC−03:30,尼泊尔标准时间是 UTC+05:45 , 而印度标准时间是 UTC+05:30),因此直接除以 60 可能会产生一些奇怪的结果...
【解决方案4】:

我认为您最好的选择是根据客户端发送的 Accept-Language 标头进行猜测。

【讨论】:

  • 检索我可以使用geoip的国家和城市。但是像“欧洲/莫斯科”这样的时区只能针对特定城市设置,而客户可以来自任何地方
  • 这是真的,Accept-Language 很可能会覆盖大面积的时区,但客户端并没有真正发送任何其他指示其时区的信息。最准确的建议是您建议基于 javascript 进行重定向,但这对于每个页面请求加载两个页面来说太糟糕了...
  • 我可以将它存储在会话中:) 这只是一个额外的请求。我想,如果我没有找到其他东西,我会走这条路。
  • 一些 Geo-IP 服务为 IP 地址提供时区。所以,这里我做了一个例子:stackoverflow.com/questions/4746249/get-user-timezone/…
猜你喜欢
  • 2013-05-24
  • 2017-03-23
  • 2014-04-24
  • 2013-07-05
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-05
相关资源
最近更新 更多