2010-02-23 95 views
6

我希望能夠猜測用戶的時區偏移以及是否應用夏令時。目前,我發現這個最具權威性的代碼是在這裏:Javascript/PHP和時區

http://www.michaelapproved.com/articles/daylight-saving-time-dst-detect/

所以這給了我與DST指標偏移一起。

現在,我想在我的PHP腳本中使用這些以便爲用戶輸出本地日期/時間....但是對此最好?我想我有兩個選擇:

a)從timezone_abbreviations_list()的輸出中選擇一個具有相同偏移量和DST設置的隨機時區。然後用這個函數調用date_timezone_set()以便將正確的處理應用到時間。

b)繼續將日​​期視爲UTC,但只需添加一些時間戳以添加適當的小時數。

我的感覺是,選項B是最好的方法。原因在於,對於A,我可以使用一個時區,雖然在偏移量/ dst方面是正確的,但在場景後面可能會有一些可以給出令人驚訝的結果的隱晦規則(我不知道但是我不認爲我可以排除)。

然後我會在每個會話開始時使用Javascript重新檢查時區,以便捕獲用戶的時區變化(非常不可能)或者他們傳遞到DST時段的時間。

對不起,大腦轉儲 - 我真的只是在某種形式的保證後,上述方法是有效的。

謝謝,

詹姆斯。

回答

7

使用JavaScript來強健地確定用戶的時區。檢出jsTimezoneDetect

它會給你一個奧爾森時區數據庫的密鑰,你可以用於服務器端的日期時間計算。

3

如果這是一個民意調查,那麼「b」是我的投票。

首先,所有時間都應該以UTC存儲。這是教條。這是一個非常明智的教條,在你的項目變得更加複雜後,你最終會說「我確實希望我已經遵循了它」。除此之外,它是存儲所有時間點的唯一明確且一致的方式。夏令時的任何時區在交換機周圍都有模糊的時間參考(例如,上午1:30通常發生兩次)。另外,當在時區之間轉換時,大多數時候您最終都會使用UTC作爲中介。

其次,你必須決定你的網站是否是國際性的。如果沒有,那麼你就爲六個美國時區制定規則並結束它。由於三個瀏覽器以自己的怪異方式報告時間戳,這仍然只有18個案例,應該可以處理它們。除此之外的任何事情,你應該認爲它需要高級學位來預測夏令時差異。時間在不同的地方在不同的日子切換。

對b最大的問題是,如果這是一個類似日曆的應用程序,如果您無法準確確定某人所在的時區,則調度仍然是個問題。例如,假設它是二月。沒有人在DST上。有人在5月5日下午6點(當地)安排了一些東西。你看到的偏移量是UTC-4。你怎麼知道這個人是否在New Brunswick觀察DST(在這種情況下,時間的意思是的意思是2100 UTC),或者Puerto Rico沒有(在這種情況下,的意思是是2200 UTC?一個棘手的問題。This post可能會有一些幫助。

+0

嗨大衛, 非常感謝您的迴應。周圍的日程安排引發了大量的對話,非常感謝。檢查出現在的鏈接... 詹姆斯。 – James 2010-02-23 16:17:35

1

如果你想依靠javascript,你可以簡單地發送utc時間/時間戳,讓客戶端將它轉換爲當地時間表示。

編輯:簡單的自包含的例子(使用jQuery)

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

如果JavaScript不可用的用戶仍然可以看到日期/時間,雖然它在UTC。
edit2:還有一個JavaScript庫(或者它甚至是一個jQuery插件?),它可以做這種事情加上一些漂亮的轉換,比如「一小時前」,「上週」等等。但我忘了我覺得不知道確切的時區,總會有你錯過了一些模糊規則的機會名稱:(

1


與大多數國際化問題,往往會出現比預期更爲模糊規則

但是我會選擇A:「選擇一個可能的時區與正確的偏移量」,因爲時區的東西往往比你想象的更復雜,特別是當你考慮夏令時的變化時。對於選項A,您可以使用PHP提供的標準功能。

您可以將其與其他指標提高你的預測質量;例如:

  • 根據訪問者統計數據:挑選大多數訪問者來自的時區;
  • 基於accept_headers:將語言與時區匹配;
  • 基於IP地理位置:在正確的時區與國家匹配。

結合上述應該給出一個相當合理的估計。但100%確定無法實現。