2009-12-15 88 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 –