2013-10-27 66 views
0

基本上我的網站是全球性的,我需要能夠檢測用戶的時區並顯示準確的時間。我有這個非常整潔的腳本,以前一直很完美地工作。它需要一個時區偏移量,我用JavaScript獲取並通過一個cookie。timezone_name_from_abbr()沒有正確識別

if(!empty($_COOKIE['tz']) && $_COOKIE['tz']>=-12 && $_COOKIE['tz']<=13){ 
    $offset = $_COOKIE['tz']; 
    $tz = timezone_name_from_abbr(null, $offset * 3600, true); 
    if($tz === false) $tz = timezone_name_from_abbr(null, $offset * 3600, false); 
    date_default_timezone_set($tz); 
}else{ 
    date_default_timezone_set('UTC'); 
} 

的問題是,我目前在測試時區爲歐洲/赫爾辛基,這是UTC + 2(無夏令),但由於某種原因timezone_name_from_abbr()決定2 * 3600歐洲/巴黎。我對日期和時區非常不滿,我非常需要幫助!

回答

3

一般來說,僅基於偏移量(例如UTC + 02:00)定位精確時區(例如Europe/HelsinkiEurope/Paris)的想法不可能具有任何可靠性或準確性。許多時區在任何給定的時間點共享相同的偏移量,並且由於夏令時規則,許多時區在一年中在兩個不同的偏移量之間切換。

您可以看到所有時區以及它們的標準和日光偏移here的列表。

即使從時區縮寫爲到時區的想法也不健全,因爲幾個時區可以共享相同的縮寫。例如,「CST」可以是「中央標準時間」(美國),「中部標準時間」(澳大利亞),「中部夏令時」(澳大利亞),「中國標準時間」或「古巴標準時間」。詳情請參閱this list

考慮到這些問題,PHP會給你一個叫做timezone_name_from_abbr的函數很奇怪。我建議避免使用它,因爲它顯然存在概念上的缺陷。

如果您在檢測到用戶所在的時區後,請考慮使用JavaScript庫jsTimeZoneDetect。它也不完美,但它一般工作,並基於更合理的算法。