2010-05-24 96 views
20

我需要確定JS中的客戶端時區(例如CET,GMT,EST)。獲得偏移量很簡單,但沒有確定TZ所需的全部信息,至少不容易。我有一種感覺,可能可能使用偏移的組合,無論DST是否正在使用和有效,等等,但我希望別人已經完成了這項工作,特別是考慮到奇怪的例外時間處理。在JS中獲取客戶端時區(不是GMT偏移量)

This question是類似的,但問題和答案都基於(不正確)的假設,每個瀏覽器的DateString格式都包含時區的名稱 - 它沒有。這是一個實現細節。

所以,我目前卡住了。

回答

7

請參閱this question。在一般情況下這是不可行的,但是從可能的情況下選擇一個默認時區,你可以做出一個合適的猜測。

允許用戶覆蓋它,因爲當你猜錯了。

+0

的確,這只是需要提供體面的猜測。如果它可以爲90%的用戶正確預填,我會非常高興。 – 2010-05-24 17:45:38

+0

嗨,有了這個,我們將獲得如Aisa/kabul那樣的時區,然後如何將它轉換爲'AFT'(縮寫形式)? – Jeevi 2012-05-02 12:11:57

+0

@Tool:不幸的是,我沒有公開地提供region-> timezone-name的查詢,所以你必須自己做。 (實際上,甚至沒有全球公認的時區縮寫。)請記住,沒有一對一的映射:例如,如果你得到該地區,你將不得不決定是否使用'GMT'或'BST'時區,具體取決於你希望表達的年份中的哪一部分。 – bobince 2012-05-03 16:29:38

1

我會做的是確定標準和日光偏移量(這聽起來像你已經知道的,如果沒有,你可以從Josh Fraser的這個參考文獻http://onlineaspect.com/examples/timezone/detect_timezone.js開始)。一旦標準和日光偏移已知,確定時區總是可以在服務器端完成。然後可以使用Ajax調用,以便不需要刷新頁面。最終結果是你現在在JavaScript端有時區。

+0

提供的鏈接說找不到。 – Ikrom 2014-02-14 05:43:11

+0

這是更正的鏈接,我猜:http://www.onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/ – Dichev 2015-09-12 23:00:22

-4

如果你只是想要偏移量,那麼這就簡單多了

var curdate = new Date();

var offset = curdate.getTimezoneOffset();

+1

OP是尋找縮寫的時區名稱。 – Gary 2012-09-24 15:59:25

+0

OP _specifically said_這不是什麼想要的。看到標題:「__not GMT抵消金額_」 – Nateowami 2015-04-07 08:32:28

32

您可以從日期對象的toString()方法中刮取它。 new Date.toString()在Firefox,Safari和Chrome中產生類似Wed Sep 19 2012 10:04:32 GMT-0400 (Eastern Daylight Time)的內容。您需要的數據就是 - 括號內的大寫字母。所需要的就是刮掉它們。

在Internet Explorer的情況下,toString()的結果已包含EDT

在Opera的情況下,您唯一的選擇是解決GMT-0400或類似的問題。在toString()方法中沒有什麼可刮擦的。

var now = new Date().toString(); 
var TZ = now.indexOf('(') > -1 ? 
now.match(/\([^\)]+\)/)[0].match(/[A-Z]/g).join('') : 
now.match(/[A-Z]{3,4}/)[0]; 
if (TZ == "GMT" && /(GMT\W*\d{4})/.test(now)) TZ = RegExp.$1; 

實施例的結果:

  • 火狐:TZ = "EDT"

  • Safari中:TZ = "EDT"

  • 鉻:TZ = "EDT"

  • IE:TZ = "EDT"

  • 歌劇:TZ = "GMT-0400"

似乎所有的隨機亞洲和歐洲時區我試圖和工作一樣好,吉隆坡返回關島(西太平洋標準時間),MPST WPST (馬來半島標準時間)等;並且在瀏覽器不提供該名稱的情況下和平地退化爲GMT + 0X00表示法(例如,珀斯)。

+0

太棒了。確切地說,很多人都在尋找我想象的 – Yablargo 2013-06-13 02:37:43

+1

感謝你 - 我們正在使用它。但它並不適用於世界各地。例如,它在沙特阿拉伯引發了一個錯誤。 *不能調用null *的方法'join'。現在我用try/catch包裝它,並將TZ設置爲'我的當地時間'作爲快速修復。我相信有一個更好的修復方法可以完成,但這個很快:) – tom 2014-03-14 18:50:41

+0

p.s.我認爲問題是Date.toString()沒有使用羅馬字母返回值,所以正則表達式不匹配 – tom 2014-03-14 19:06:42

0

this answer起另一個問題,我發現IP API也給你的時區 - 非常方便:

$.ajax({ 
    url: "http://ip-api.com/json", 
    type: 'GET', 
    success: function(json) { 
     console.log("Timezone: " + json.timezone); 
    }, 
    error: function(err) { 
     console.log("Request failed, error= " + err); 
    } 
}); 
相關問題