2009-12-15 59 views
22

我正在写一个使用Zend_Framework的应用程序(所以解决方案可以依靠它)。如何获取客户的时区?

如何获取客户端的时区?例如,如果有人在俄罗斯莫斯科,我想得到3 * 60 * 60(因为有UTC + 3)。如果他在英国,我想要零。如果他使用UTC-3:30(加拿大?),我想要-3.5 * 60 * 60。 (这不是关于格式的问题 - 我可以在俄罗斯圣彼得堡获得“欧洲/莫斯科”或“UTC-3”),而是获得时区客户端的使用。首选)

想到的唯一的解决办法是让JavaScript获取本地时间和重定向。

+2

注意,都在这个问题的答案是有缺陷的,因为他们只拿到了*电流*偏移。请参阅[时区标记wiki](http://stackoverflow.com/tags/timezone/info)中的“Time Zone!= Offset”,并查看dup问题及其答案。 –

回答

7

结账this article on how to detect the timezone通过设置一个Cookie来保存客户端的时区。它很长,但那是因为它非常冗长。我已经在我自己的一个应用程序中沿着这些线路实施了一个解决方案,它工作得很好。

您也可以通过Ajax将时区发送到服务器,然后让它做任何您需要的操作。或者,如果您没有对其进行任何计算机计算,只需在需要时应用时区客户端。真的取决于你的用例。

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

+8

该链接已损坏。这可能是一个副本:http://blog.codez.in/php5-time-zone-solution/web-development/2010/07/09 –

+0

@Jose感谢您指出并提供替代 – Gordon

+1

现在这两个链接已破碎: - ( – rmirabelle

-1

我认为你最好的选择是根据客户发送的Accept-Language标题猜测。

+0

检索国家和城市我可以使用geoip。但是像'欧洲/莫斯科'这样的时区只能在特定的城市设置,而客户端可以在任何地方 –

+0

这是真的,接受语言很可能会覆盖大面积的时区,但客户端并没有真正发送任何东西否则,表明他们的时区。最准确的是你的建议,基于JavaScript的重定向,但这是不好的每页请求两个页面加载... – Myles

+0

我可以将它存储在一个会话然后:)这只是一个额外的请求。我想,如果我没有找到其他东西,我会这样去。 –

8

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

在PHP页面,你想拥有的时区作为一个变量,有此代码段靠近页面顶部的地方:

<?php  
    session_start(); 
    $timezone = $_SESSION['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时区偏移量(格林威治标准时间-7)或你所在的任何时区。

+0

混合javascript和php-code?你认真吗? – drull

+4

为什么不呢?除非我弄错了,否则时区只能在客户端声明,并且在php会话增加了很多灵活性 – americanknight

+0

是的,ofc,你需要javascript来做到这一点,但是我正在讨论把纯php嵌入到html中:它是猴子编码。鲈。如果我这样做,我会被解雇:) – drull

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')); 
+0

'new DateTime('now',new DateTimeZone('GMT') );'可能应该使用'UTC'而不是'''每个MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset –