क्या क्लाइंट ब्राउज़र से टाइमज़ोन प्राप्त करने का एक विश्वसनीय तरीका है? मैंने निम्नलिखित लिंक देखे, लेकिन मैं अधिक मजबूत समाधान चाहता हूं।
क्या क्लाइंट ब्राउज़र से टाइमज़ोन प्राप्त करने का एक विश्वसनीय तरीका है? मैंने निम्नलिखित लिंक देखे, लेकिन मैं अधिक मजबूत समाधान चाहता हूं।
जवाबों:
इस रिपोजिटरी पगेलूम को देखें तो यह मददगार है
jstz.min.js डाउनलोड करें और अपने HTML पृष्ठ पर एक फ़ंक्शन जोड़ें
<script language="javascript">
function getTimezoneName() {
timezone = jstz.determine()
return timezone.name();
}
</script>
और अपने प्रदर्शन टैग से इस फ़ंक्शन को कॉल करें
Intl.DateTimeFormat().resolvedOptions().timeZone
वैलेस द्वारा सुझाए गए (कोई IE11) का उपयोग कर सकते हैं ।
डेढ़ दशक बाद हमारे पास इसके लिए एक अंतर्निहित तरीका है! आधुनिक ब्राउज़रों के लिए मैं उपयोग करूंगा:
const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
console.log(tz);
यह एक IANA टाइमज़ोन स्ट्रिंग देता है, लेकिन ऑफ़सेट नहीं । MDN संदर्भ में अधिक जानें ।
संगतता तालिका - मार्च 2019 तक, विश्व स्तर पर 90% ब्राउज़रों के लिए काम करती है। इंटरनेट एक्सप्लोरर पर काम नहीं करता है ।
Intl.DateTimeFormat().resolvedOptions().timeZone
->undefined
Intl.DateTimeFormat().resolvedOptions().timeZone
उम्मीद मान प्रदान करेंगे फ़ायरफ़ॉक्स 52 से शुरू: kangax.github.io/compat-table/esintl/...
अक्सर जब लोग "टाइमज़ोन" की तलाश में होते हैं, तो क्या पर्याप्त होगा "यूटीसी ऑफसेट"। उदाहरण के लिए, उनका सर्वर 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 एक अधिक आधुनिक, छोटा विकल्प है।)
अभी के लिए, सबसे अच्छा शर्त शायद jstz है जैसा कि mbayloon के उत्तर में सुझाया गया है ।
पूर्णता के लिए, यह उल्लेख किया जाना चाहिए कि इसके रास्ते में एक मानक है: Intl । आप इसे क्रोम में पहले से देख सकते हैं:
> Intl.DateTimeFormat().resolvedOptions().timeZone
"America/Los_Angeles"
(यह वास्तव में मानक का पालन नहीं करता है, जो पुस्तकालय के साथ छड़ी करने का एक और कारण है)
Intl
लिए वापस लौटाए जाने चाहिए । क्रोम इसके बजाय सिस्टम के टाइमज़ोन को वापस करके मानक से भटक जाता है; कि जोहान्स का जवाब क्या शोषण करता है, लेकिन यह भी कि उसने क्यों कहा "वास्तव में मानक का पालन नहीं करता है"। undefined
timeZone
DateTimeFormat
आप समय-समय का उपयोग करने के लिए समय-क्षेत्र का अनुमान लगा सकते हैं :
> moment.tz.guess()
"America/Asuncion"
यहाँ एक jsfiddle है
यह वर्तमान उपयोगकर्ता टाइमज़ोन का संक्षिप्त नाम प्रदान करता है।
यहाँ कोड नमूना है
var tz = jstz.determine();
console.log(tz.name());
console.log(moment.tz.zone(tz.name()).abbr(new Date().getTime()));
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()));
मैंने जोश फ्रेजर द्वारा लिए गए एक दृष्टिकोण के समान उपयोग किया , जो यूटीसी से ब्राउज़र समय ऑफसेट को निर्धारित करता है और यह डीएसटी को मान्यता देता है या नहीं (लेकिन अपने कोड से कुछ सरल किया गया है):
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
जून के बजाय जुलाई के लिए उपयोग कर सकते हैं । मुझे यकीन नहीं है कि यह वास्तव में कोई फर्क पड़ता है, क्योंकि मुझे संदेह है कि क्षेत्रीय डीएसटी योजनाएं हैं जिनमें जून शामिल नहीं है।
नहीं। कोई विश्वसनीय तरीका नहीं है और कभी भी नहीं होगा। क्या आपको वास्तव में लगा कि आप क्लाइंट पर भरोसा कर सकते हैं?