ब्राउज़र से क्लाइंट टाइम ज़ोन प्राप्त करें


139

क्या क्लाइंट ब्राउज़र से टाइमज़ोन प्राप्त करने का एक विश्वसनीय तरीका है? मैंने निम्नलिखित लिंक देखे, लेकिन मैं अधिक मजबूत समाधान चाहता हूं।

ऑटो जावास्क्रिप्ट के साथ एक समय क्षेत्र का पता लगाता है

जावास्क्रिप्ट में टाइमजोन का पता लगाना



8
मैंने jsTimezoneDetect लिखा है कि आप ऊपर से लिंक करते हैं, और मेरी स्थिति यह है कि यह उतना ही निकट है जितना कि आप शुद्ध क्रॉस ब्राउज़र जावास्क्रिप्ट (जियोलोकेशन और आईपी लुकअप के बिना) के साथ प्राप्त कर सकते हैं।
जॉन नाइलैंडर

जवाबों:


87

इस रिपोजिटरी पगेलूम को देखें तो यह मददगार है

jstz.min.js डाउनलोड करें और अपने HTML पृष्ठ पर एक फ़ंक्शन जोड़ें

<script language="javascript">
    function getTimezoneName() {
        timezone = jstz.determine()
        return timezone.name();
    }
</script>

और अपने प्रदर्शन टैग से इस फ़ंक्शन को कॉल करें


13
TL, DR हम अब Intl.DateTimeFormat().resolvedOptions().timeZoneवैलेस द्वारा सुझाए गए (कोई IE11) का उपयोग कर सकते हैं ।
कोड

195

डेढ़ दशक बाद हमारे पास इसके लिए एक अंतर्निहित तरीका है! आधुनिक ब्राउज़रों के लिए मैं उपयोग करूंगा:

const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(tz);

यह एक IANA टाइमज़ोन स्ट्रिंग देता है, लेकिन ऑफ़सेट नहीं । MDN संदर्भ में अधिक जानें ।

संगतता तालिका - मार्च 2019 तक, विश्व स्तर पर 90% ब्राउज़रों के लिए काम करती है। इंटरनेट एक्सप्लोरर पर काम नहीं करता है


4
फ़ायरफ़ॉक्स में काम नहीं करता है: Intl.DateTimeFormat().resolvedOptions().timeZone ->undefined
टॉमस टोमसेक

3
फ़ायरफ़ॉक्स और IE संपत्ति का समर्थन नहीं करने के लिए लगता है :( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
वालेस

5
Intl.DateTimeFormat().resolvedOptions().timeZoneउम्मीद मान प्रदान करेंगे फ़ायरफ़ॉक्स 52 से शुरू: kangax.github.io/compat-table/esintl/...
Julen

यह कैसे उपयोग होता है यह एक रूप है? जैसा कि सुझाए गए एक छिपे हुए मूल्य मेंडेवलपर . ?
२५'१

4
फ़ायरफ़ॉक्स में अब काम करता है
डस्टिन मिशेल्स

76

अक्सर जब लोग "टाइमज़ोन" की तलाश में होते हैं, तो क्या पर्याप्त होगा "यूटीसी ऑफसेट"। उदाहरण के लिए, उनका सर्वर UTC + 5 में है और वे जानना चाहते हैं कि उनका ग्राहक UTC-8 में चल रहा है


सादे पुराने जावास्क्रिप्ट में (new Date()).getTimezoneOffset()/60यूटीसी से वर्तमान घंटों की संख्या वापस आ जाएगी।

यह getTimezoneOffset()रिटर्न वैल्यू (एमडीएन डॉक्स से) के संकेत में एक संभावित "गोचा" ध्यान देने योग्य है :

UTC और स्थानीय समय के बीच, समय-क्षेत्र ऑफ़सेट अंतर है, मिनटों में। ध्यान दें कि इसका मतलब है कि ऑफसेट सकारात्मक है अगर स्थानीय टाइमज़ोन UTC के पीछे है और नकारात्मक है अगर यह आगे है। उदाहरण के लिए, समय क्षेत्र UTC + 10: 00 (ऑस्ट्रेलियाई पूर्वी मानक समय, व्लादिवोस्तोक समय, चमोरो मानक समय) के लिए, -600 वापस कर दिया जाएगा।


हालांकि, मैं आप का उपयोग की सलाह देते हैं day.js समय / तारीख संबंधित जावास्क्रिप्ट कोड के लिए। जिस स्थिति में आप एक आईएसओ 8601 फॉर्मेट करके यूटीसी ऑफसेट चला सकते हैं:

> dayjs().format("Z")
"-08:00"

यह शायद इस बात का उल्लेख करता है कि ग्राहक इस जानकारी को आसानी से गलत साबित कर सकता है।

(नोट: यह उत्तर मूल रूप से https://momentjs.com/ की अनुशंसा करता है , लेकिन dayjs एक अधिक आधुनिक, छोटा विकल्प है।)


30
यह ध्यान देने योग्य हो सकता है कि ऑफसेट और टाइम ज़ोन आवश्यक रूप से एक ही चीज़ नहीं हैं।
डेक्स

9
केवल ऑफसेट से आप डीएसटी कैसे लागू करेंगे? उन क्षेत्रों में ऑफसेट आधा वर्ष गलत है। IMO का समयक्षेत्र अधिक सटीक है।
सावेजमैन

4
डीएसटी किसी भी समय ऑफसेट का हिस्सा है। सर्दियों में मध्य यूरोपीय समय UTC + 01: 00 है। हालांकि, जब डीएसटी लागू किया जाता है तो सीईटी यूटीसी + 02: 00 है, जैसे कि अब मैं डेनमार्क में हूं।
गर्ट सोन्डरबी सेप

1
यही कारण है कि getTimezoneOffset () को काम करने की एक तारीख चाहिए - यह उस समय प्रभाव में DST में जोड़ देगा।
ओसामाबिनलोगिन

2
डेलाइट सेविंग पर विचार करते समय ऑफसेट सटीक नहीं है।
ग्रेग एल।

48

अभी के लिए, सबसे अच्छा शर्त शायद jstz है जैसा कि mbayloon के उत्तर में सुझाया गया है

पूर्णता के लिए, यह उल्लेख किया जाना चाहिए कि इसके रास्ते में एक मानक है: Intl । आप इसे क्रोम में पहले से देख सकते हैं:

> Intl.DateTimeFormat().resolvedOptions().timeZone
"America/Los_Angeles"

(यह वास्तव में मानक का पालन नहीं करता है, जो पुस्तकालय के साथ छड़ी करने का एक और कारण है)


1
Intl सब कुछ लेकिन सफारी में स्थिर लग रहा है। caniuse.com/#feat=internationalization
माइकल कोल

2
यदि आप मैन्युअल रूप से निर्माण में एक समय क्षेत्र निर्दिष्ट नहीं करते हैं तो @MichaelCole अनुरूप कार्यान्वयन संपत्ति के Intlलिए वापस लौटाए जाने चाहिए । क्रोम इसके बजाय सिस्टम के टाइमज़ोन को वापस करके मानक से भटक जाता है; कि जोहान्स का जवाब क्या शोषण करता है, लेकिन यह भी कि उसने क्यों कहा "वास्तव में मानक का पालन नहीं करता है"। undefinedtimeZoneDateTimeFormat
क्रिस जस्टर-यंग

20
FYI करें - मानक अब Intl.DateTimeFormat () है। SolveOptions ()। timeZone
नीदरलैंड


4

यहाँ एक jsfiddle है

यह वर्तमान उपयोगकर्ता टाइमज़ोन का संक्षिप्त नाम प्रदान करता है।

यहाँ कोड नमूना है

var tz = jstz.determine();
console.log(tz.name());
console.log(moment.tz.zone(tz.name()).abbr(new Date().getTime()));

1
दिनांक का May 22 2015 03:45 PM CDT उपयोग करने के लिए जैसा कि मैंने किया था console.log(moment(now).format('MMM DD YYYY hh:mm A') + ' ' + moment.tz.zone(tz.name()).abbr(now.getTime()));
αƞji date

5
आपकी फ़ाइडल अब काम नहीं कर रही है और कंसोल में त्रुटियां दे रही है।
सौमिल

2

मैंने जोश फ्रेजर द्वारा लिए गए एक दृष्टिकोण के समान उपयोग किया , जो यूटीसी से ब्राउज़र समय ऑफसेट को निर्धारित करता है और यह डीएसटी को मान्यता देता है या नहीं (लेकिन अपने कोड से कुछ सरल किया गया है):

var ClientTZ = {
    UTCoffset:  0,          // Browser time offset from UTC in minutes
    UTCoffsetT: '+0000S',   // Browser time offset from UTC in '±hhmmD' form
    hasDST:     false,      // Browser time observes DST

    // Determine browser's timezone and DST
    getBrowserTZ: function () {
        var self = ClientTZ;

        // Determine UTC time offset
        var now = new Date();
        var date1 = new Date(now.getFullYear(), 1-1, 1, 0, 0, 0, 0);    // Jan
        var diff1 = -date1.getTimezoneOffset();
        self.UTCoffset = diff1;

        // Determine DST use
        var date2 = new Date(now.getFullYear(), 6-1, 1, 0, 0, 0, 0);    // Jun
        var diff2 = -date2.getTimezoneOffset();
        if (diff1 != diff2) {
            self.hasDST = true;
            if (diff1 - diff2 >= 0)
                self.UTCoffset = diff2;     // East of GMT
        }

        // Convert UTC offset to ±hhmmD form
        diff2 = (diff1 < 0 ? -diff1 : diff1) / 60;
        var hr = Math.floor(diff2);
        var min = diff2 - hr;
        diff2 = hr * 100 + min * 60;
        self.UTCoffsetT = (diff1 < 0 ? '-' : '+') + (hr < 10 ? '0' : '') + diff2.toString() + (self.hasDST ? 'D' : 'S');

        return self.UTCoffset;
    }
};

// Onload
ClientTZ.getBrowserTZ();

लोड करने पर, ClientTZ.getBrowserTZ()फ़ंक्शन निष्पादित होता है, जो सेट करता है:

  • ClientTZ.UTCoffset ब्राउज़र समय यूटीसी से मिनटों में ऑफसेट (जैसे, सीएसटी ,360 मिनट है, जो यूटीसी से hours6.0 घंटे है);
  • ClientTZ.UTCoffsetTफॉर्म '±hhmmD'(जैसे '-0600D') में ऑफसेट , जहां प्रत्यय Dडीएसटी के लिए और Sमानक (गैर-डीएसटी) के लिए है;
  • ClientTZ.hasDST (सत्य या असत्य के लिए)।

ClientTZ.UTCoffset, बजाय घंटे के मिनट में प्रदान की जाती है क्योंकि कुछ समय क्षेत्र आंशिक प्रति घंटा ऑफसेट (जैसे, 0415) है है।

पीछे की मंशा ClientTZ.UTCoffsetTइसे समय-सारणी की तालिका में एक कुंजी के रूप में उपयोग करना है (यहां प्रदान नहीं की गई है), जैसे कि ड्रॉप-डाउन <select>सूची के लिए।


ऐसा लगता है कि यदि दिन की बचत देखी जाती है तो यह हमेशा 'डी' लौटाएगा। और केवल पांच महीने का अंतर क्यों? निश्चित रूप से, जनवरी और जुलाई अधिक मज़बूती से काम करेगा?
मैट

@ मैट - हाँ, आप 7-1जून के बजाय जुलाई के लिए उपयोग कर सकते हैं । मुझे यकीन नहीं है कि यह वास्तव में कोई फर्क पड़ता है, क्योंकि मुझे संदेह है कि क्षेत्रीय डीएसटी योजनाएं हैं जिनमें जून शामिल नहीं है।
डेविड आर ट्रिब्बल

-13

नहीं। कोई विश्वसनीय तरीका नहीं है और कभी भी नहीं होगा। क्या आपको वास्तव में लगा कि आप क्लाइंट पर भरोसा कर सकते हैं?


23
स्पष्ट करने के लिए: क्लाइंट की घड़ी को सही तरीके से सेट नहीं किया जा सकता है, या वे दुर्भावनापूर्ण रूप से आपको यह सोचकर मूर्ख बनाने की कोशिश कर सकते हैं कि वे वास्तविक से अलग समय क्षेत्र में हैं। यदि आप ग्राहक के समय क्षेत्र का उपयोग करने जा रहे हैं, तो इसे किसी भी महत्वपूर्ण काम के लिए न करें।
रायन काइल

7
-1 संभावित रूप से भ्रामक उत्तर देने के लिए और स्पष्ट नहीं करने के लिए।
डग एस

6
हां, मेरे आवेदन के लिए मैं ग्राहक पर भरोसा कर सकता हूं। यदि क्लाइंट गलत तरीके से कॉन्फ़िगर किया गया है या उसके पास बग है, तो वह मेरे उपयोगकर्ताओं पर है।
माइकल कोल

3
मैं वास्तव में फ्लोरियन से सहमत हूं। विश्वसनीय विधि? एक प्रकार का। विश्वसनीय डेटा? निश्चित रूप से नहीं।
रॉब

4
सवाल यह नहीं कहता है कि डेटा का उपयोग कैसे किया जाएगा। उदाहरण के लिए यह नहीं कहता है कि पता चला कि टाइमजोन कभी भी एक सर्वर को प्रस्तुत किया जाएगा। यदि डेटा को शुद्ध रूप से स्थानीय रूप से उपयोग किया जाता है तो ट्रस्ट के बारे में टिप्पणी अप्रासंगिक है।
डोलमेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.