2010-05-24 17 views
20

में क्लाइंट टाइमज़ोन (जीएमटी ऑफसेट राशि नहीं) प्राप्त करें मुझे जेएस में क्लाइंट टाइमज़ोन (उदा। सीईटी, जीएमटी, ईएसटी) निर्धारित करने की आवश्यकता है। ऑफसेट प्राप्त करना सीधा है, लेकिन कम से कम आसानी से टीजेड निर्धारित करने के लिए आवश्यक सभी जानकारी नहीं है। मुझे लगता है कि ऑफसेट के संयोजन का उपयोग करना संभव हो सकता है, चाहे डीएसटी उपयोग में है और असल में, आदि। लेकिन मुझे उम्मीद है कि किसी और ने पहले से ही काम किया है, विशेष रूप से समय के साथ निपटने के दौरान अजीब अपवादों पर विचार करना ।जेएस

This question समान है लेकिन प्रश्न और उत्तर दोनों (गलत) धारणा पर आधारित हैं, प्रत्येक ब्राउज़र के डेटस्ट्रिंग प्रारूप में टाइमज़ोन का नाम शामिल है - जो यह नहीं करता है। यह एक कार्यान्वयन विस्तार है।

तो, इसके साथ में मैं वर्तमान में अटक गया हूं।

उत्तर

7

this question देखें। यह सामान्य मामले में करने योग्य नहीं है, लेकिन संभावित मामलों की एक छोटी सूची से डिफ़ॉल्ट टाइमज़ोन चुनने के लिए, आप एक सभ्य अनुमान लगा सकते हैं।

जब आप गलत अनुमान लगाते हैं तो उपयोगकर्ता इसे ओवरराइड करने दें।

+0

वास्तव में, यह केवल एक आपूर्ति करने की आवश्यकता है सभ्य अनुमान यदि यह 90% उपयोगकर्ताओं के लिए सही ढंग से पूर्ववत कर सकता है तो मैं बहुत खुश हूं। –

+0

हाय ... इसके साथ, हमें समय क्षेत्र मिल जाएगा जैसा कि ऐसा/कबुल कहते हैं कि इसे 'एएफटी' (संक्षिप्त रूप) में कैसे परिवर्तित करें ?? – Jeevi

+0

@TFool: दुर्भाग्यवश, क्षेत्र-> टाइमज़ोन-नाम के लिए कोई सार्वजनिक रूप से उपलब्ध लुकअप नहीं है जिसे मैं जानता हूं, इसलिए आपको अपना खुद का बनाना होगा। (असल में टाइमज़ोन संक्षेपों का एक विश्व स्तर पर स्वीकार्य सेट भी नहीं है।) ध्यान रखें कि एक-से-एक मैपिंग नहीं है: उदाहरण के लिए यदि आपको क्षेत्र मिलता है तो आपको यह तय करना होगा कि 'जीएमटी' का उपयोग करना है या नहीं। या उस समय के आधार पर 'बीएसटी' टाइमज़ोन, जिस समय आप व्यक्त करना चाहते हैं, उसमें है। – bobince

1

मैं क्या करूँगा मानक और डेलाइट ऑफसेट निर्धारित करना (जो आपको लगता है कि पहले से ही पता था। यदि नहीं, तो आप जोश फ्रेज़र द्वारा http://onlineaspect.com/examples/timezone/detect_timezone.js इस संदर्भ से शुरू कर सकते हैं)। एक बार मानक और डेलाइट ऑफसेट ज्ञात होने के बाद समय क्षेत्र निर्धारित करना सर्वर पक्ष पर हमेशा किया जा सकता है। तब एक अजाक्स कॉल का उपयोग किया जा सकता है ताकि कोई पेज रीफ्रेश की आवश्यकता न हो। अंत परिणाम यह है कि अब आपके पास जावास्क्रिप्ट पक्ष पर समय क्षेत्र है।

+0

दिए गए लिंक नहीं मिला कहते हैं। – Ikrom

+0

यह सही लिंक है, मुझे लगता है: http://www.onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/ – Dichev

-4

तुम सिर्फ ऑफसेट चाहते हैं, तो इस बहुत सरल

वर curdate = new Date है();

var offset = curdate.getTimezoneOffset();

+1

ओपी था संक्षिप्त टाइमज़ोन नाम की तलाश में है। – Gary

+0

ओपी _ विशेष रूप से कहा_ यह वांछित नहीं था। शीर्षक देखें: "__not जीएमटी ऑफसेट राशि__" – Nateowami

32

आप इसे डेट ऑब्जेक्ट की toString() विधि से स्क्रैप कर सकते हैं। new Date.toString() फ़ायरफ़ॉक्स, सफारी और क्रोम में Wed Sep 19 2012 10:04:32 GMT-0400 (Eastern Daylight Time) जैसे कुछ में परिणाम देता है। जो डेटा आप चाहते हैं वह है - कोष्ठक के भीतर पूंजी अक्षरों। उन सभी को जरूरी है जो उन्हें जरूरी है।

इंटरनेट एक्सप्लोरर के मामले में, toString() के परिणाम में पहले से ही EDT शामिल है।

ओपेरा के मामले में, आपका एकमात्र विकल्प 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"

  • सफारी: TZ = "EDT"

  • क्रोम: TZ = "EDT"

  • आईई: TZ = "EDT"

  • ओपेरा: TZ = "GMT-0400"

सभी यादृच्छिक एशियाई और यूरोपीय समय क्षेत्र मैं भी करने की कोशिश की के साथ बस के रूप में अच्छी तरह से काम करने के लिए, कुआलालंपुर के लिए गुआम (पश्चिम प्रशांत मानक समय), MPST के लिए WPST लौटने लगता है (मलय प्रायद्वीप मानक समय), आदि; और जीएमटी + 0 एक्स 00 नोटेशन में शांतिपूर्वक गिरावट आती है जहां ब्राउजर नाम की आपूर्ति नहीं करता है (उदाहरण के लिए पर्थ, उदाहरण के लिए)।

+0

शानदार। वास्तव में लोग क्या देख रहे हैं मैं कल्पना करता हूं कि – Yablargo

+1

इसके लिए धन्यवाद - हम इसका उपयोग कर रहे हैं। लेकिन यह दुनिया के सभी हिस्सों में काम नहीं करता है। उदाहरण के लिए, यह सऊदी अरब में एक त्रुटि फेंकता है। * शून्य * की विधि 'शामिल' कॉल नहीं कर सकता। अभी के लिए मैं इसे एक कोशिश/पकड़ में लपेट रहा हूं, और टीजेड को 'मेरे स्थानीय समय' में त्वरित सुधार के रूप में सेट कर रहा हूं। मुझे यकीन है कि करने के लिए एक बेहतर फिक्स है, लेकिन यह एक त्वरित है :) – tom

+0

पेज। मुझे लगता है कि मुद्दा यह है कि Date.toString() रोमन वर्णमाला का उपयोग करके एक मूल्य वापस नहीं कर रहा है, इसलिए regex – tom

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); 
    } 
});