如何获得客户的时区?

时间:2009-12-15 05:44:04

标签: php zend-framework timezone

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

如何获得客户的时区?

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

(这不是关于格式的问题 - 我对俄罗斯圣彼得堡的'欧洲/莫斯科'或'UTC-3'感到满意,而是让时区客户使用它。但是以秒为单位的delta是首选)

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

4 个答案:

答案 0 :(得分:10)

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

在您希望将时区作为变量的PHP页面上,在页面顶部附近放置一段代码:

<?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>

您可能已经注意到或未注意到,但您需要将网址更改为您的实际域名。

最后一件事。你可能想知道什么是timezone.php。嗯,这只是这个: (创建一个名为 timezone.php 的新文件,并使用上述网址指向该文件)

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

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

答案 1 :(得分:8)

通过设置包含客户端时区的JavaScript的Cookie来查看 this article on how to detect the timezone 。它相当长,但那是因为它非常冗长。我已经在我自己的一个应用程序中实现了这些方面的解决方案,并且它运行良好。

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

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

答案 2 :(得分: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 :(得分:-1)

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