我需要確定JS中的客戶端時區(例如CET,GMT,EST)。獲得偏移量很簡單,但沒有確定TZ所需的全部信息,至少不容易。我有一種感覺,可能可能使用偏移的組合,無論DST是否正在使用和有效,等等,但我希望別人已經完成了這項工作,特別是考慮到奇怪的例外時間處理。在JS中獲取客戶端時區(不是GMT偏移量)
This question是類似的,但問題和答案都基於(不正確)的假設,每個瀏覽器的DateString格式都包含時區的名稱 - 它沒有。這是一個實現細節。
所以,我目前卡住了。
我需要確定JS中的客戶端時區(例如CET,GMT,EST)。獲得偏移量很簡單,但沒有確定TZ所需的全部信息,至少不容易。我有一種感覺,可能可能使用偏移的組合,無論DST是否正在使用和有效,等等,但我希望別人已經完成了這項工作,特別是考慮到奇怪的例外時間處理。在JS中獲取客戶端時區(不是GMT偏移量)
This question是類似的,但問題和答案都基於(不正確)的假設,每個瀏覽器的DateString格式都包含時區的名稱 - 它沒有。這是一個實現細節。
所以,我目前卡住了。
請參閱this question。在一般情況下這是不可行的,但是從可能的情況下選擇一個默認時區,你可以做出一個合適的猜測。
允許用戶覆蓋它,因爲當你猜錯了。
我會做的是確定標準和日光偏移量(這聽起來像你已經知道的,如果沒有,你可以從Josh Fraser的這個參考文獻http://onlineaspect.com/examples/timezone/detect_timezone.js開始)。一旦標準和日光偏移已知,確定時區總是可以在服務器端完成。然後可以使用Ajax調用,以便不需要刷新頁面。最終結果是你現在在JavaScript端有時區。
您可以從日期對象的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表示法(例如,珀斯)。
從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);
}
});
的確,這只是需要提供體面的猜測。如果它可以爲90%的用戶正確預填,我會非常高興。 – 2010-05-24 17:45:38
嗨,有了這個,我們將獲得如Aisa/kabul那樣的時區,然後如何將它轉換爲'AFT'(縮寫形式)? – Jeevi 2012-05-02 12:11:57
@Tool:不幸的是,我沒有公開地提供region-> timezone-name的查詢,所以你必須自己做。 (實際上,甚至沒有全球公認的時區縮寫。)請記住,沒有一對一的映射:例如,如果你得到該地區,你將不得不決定是否使用'GMT'或'BST'時區,具體取決於你希望表達的年份中的哪一部分。 – bobince 2012-05-03 16:29:38