डीएसटी (डेलाइट सेविंग टाइम) प्रभावी होने की जाँच कैसे करें, और यदि ऐसा है तो ऑफसेट?


154

यह मेरा JS कोड है, जिसके लिए यह आवश्यक है:

var secDiff = Math.abs(Math.round((utc_date-this.premiere_date)/1000));
this.years = this.calculateUnit(secDiff,(86400*365));
this.days = this.calculateUnit(secDiff-(this.years*(86400*365)),86400);
this.hours = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)),3600);
this.minutes = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)),60);
this.seconds = this.calculateUnit((secDiff-(this.years*(86400*365))-(this.days*86400)-(this.hours*3600)-(this.minutes*60)),1);

मैं "पहले" में डेटटाइम प्राप्त करना चाहता हूं, लेकिन यदि डीएसटी उपयोग में है तो तिथियां 1 घंटे से बंद हैं। मुझे नहीं पता कि डीएसटी प्रभाव में है या नहीं, कैसे जांचें।

जब दिन की बचत शुरू होती है और समाप्त होती है तो मुझे कैसे पता चलेगा?

जवाबों:


313

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

ध्यान दें कि UTC के पश्चिम के लिए मिनटों की सकारात्मक संख्या getTimezoneOffsetलौटाती है , जो आमतौर पर नकारात्मक घंटों के रूप में बताई जाती है (क्योंकि वे "UTC" के पीछे हैं)। उदाहरण के लिए, लॉस एंजिल्स UTC-8h मानक, UTC-7h DST है। रिटर्न (सकारात्मक 480 मिनट) दिसंबर (सर्दियों, मानक समय) के बजाय । यह पूर्वी गोलार्ध के लिए नकारात्मक संख्या देता है (जैसे कि सर्दियों में सिडनी के लिए, इसके बावजूद "आगे" ( UTC + 10h )।getTimezoneOffset480-480-600

Date.prototype.stdTimezoneOffset = function () {
    var jan = new Date(this.getFullYear(), 0, 1);
    var jul = new Date(this.getFullYear(), 6, 1);
    return Math.max(jan.getTimezoneOffset(), jul.getTimezoneOffset());
}

Date.prototype.isDstObserved = function () {
    return this.getTimezoneOffset() < this.stdTimezoneOffset();
}

var today = new Date();
if (today.isDstObserved()) { 
    alert ("Daylight saving time!");
}

28
मैं सत्यापित कर सकता हूं कि यह अंतरराष्ट्रीय स्तर पर काम करता है। वर्तमान में कोई भी समय क्षेत्र नहीं हैं जो DST के किसी भी रूप का उपयोग करते हैं जहां 1 जनवरी और 1 जुलाई दोनों DST की अवधि से बाहर या दोनों में हैं। इसके अलावा, सभी समय क्षेत्रों में टीबीडीबी ( एक तुच्छ अपवाद के साथ ) दो ऑफसेट का बड़ा हिस्सा डीएसटी ऑफसेट है। चूंकि जावास्क्रिप्ट getTimezoneOffsetउलटा मान लौटाता है, तो Math.maxवास्तव में मानक ऑफसेट वापस आ रहा है । कोड सही है।
मैट जॉनसन-पिंट

7
हालाँकि, यदि कोई समय क्षेत्र कभी भी अपनी परिभाषा में परिवर्तन करता है जैसे कि जनवरी 1 और Jul 1 दोनों या तो DST में हैं, या दोनों DST में नहीं हैं (और DST अभी भी लागू होते हैं), तो यह कोड उस क्षेत्र में काम नहीं करेगा।
मैट जॉनसन-पिंट

9
यह सामान्य रूप से काम नहीं करता है, उदाहरण के लिए ऐसे देश हैं जिन्होंने कुछ वर्षों में डीएसटी का अवलोकन नहीं किया है और कुछ देश रमजान के दौरान डीएसटी को वापस करते हैं। उसके आगे, दिनांक के लिए ECMAScript परिभाषा टूट गई है और साथ ही कुछ कार्यान्वयनों में TZ पर्यावरण चर की हैंडलिंग भी टूट गई है। यह सब संयुक्त इस विधि को अविश्वसनीय बनाता है। आप एक पुस्तकालय है कि दिनांक का उपयोग नहीं करता का उपयोग कर बेहतर कर रहे हैं जैसे timezonecomplete
rogierschouten

5
यह कोड उन देशों में काम नहीं करता है जो DST का निरीक्षण नहीं करते हैं, जैसे दक्षिण अफ्रीका या आइसलैंड; यदि आप उन देशों के अन्य समय क्षेत्रों के साथ तुलना करने के लिए इसका उपयोग करते हैं, तो यह वहां पर सही समय नहीं दिखाएगा। सभी तरह से यूटीसी का उपयोग करने का सुझाव दें, और मैन्युअल रूप से जांचें कि क्या अब समय एक निश्चित डीएसटी सीमा के भीतर है। फिर यह डीएसटी प्राप्त करने के लिए सामान्य समय यूटीसी ऑफसेट को +1 से बदलने की बात है।
केबमन

1
यह कैसे सही हो सकता है? उदाहरण के लिए जर्मनी ने 2016-10-30 पर डीएसटी में प्रवेश किया जबकि यूएसए ने एक सप्ताह बाद 2016-11-06 में प्रवेश किया। इस तरह की बुरी जानकारी यह है कि ऐसा होने के कारण सामान क्या है: macworld.co.uk/news/apple/…
डैनियल एफ

22

दो तिथियां बनाएं: एक जून में, एक जनवरी में। उनके getTimezoneOffset () मानों की तुलना करें।

  • अगर जनवरी ऑफ़सेट> जून ऑफ़सेट, क्लाइंट उत्तरी गोलार्ध में है
  • यदि जनवरी ऑफ़सेट <जून ऑफ़सेट, क्लाइंट दक्षिणी गोलार्ध में है
  • यदि कोई अंतर नहीं है, तो क्लाइंट टाइमज़ोन डीएसटी का पालन नहीं करता है

अब वर्तमान तिथि की getTimezoneOffset () की जांच करें।

  • यदि जून, उत्तरी गोलार्ध के बराबर है, तो वर्तमान समय क्षेत्र DST (+1 घंटा) है
  • यदि जनवरी, दक्षिणी गोलार्ध के बराबर है, तो वर्तमान समय क्षेत्र DST (+1 घंटा) है

आपको गोलार्ध की आवश्यकता क्यों है? क्या यह कहना पर्याप्त नहीं होगा कि यदि वर्तमान तिथि के लिए getTimezoneOffset () दो getTimezoneOffset () के छोटे बराबर है तो इसका DST? [(ऑफसेट दोनों के बीच का अंतर है?]
8

आपको गोलार्ध की आवश्यकता नहीं है क्योंकि स्वीकृत उत्तर स्पष्ट रूप से प्रदर्शित होता है :)
जॉन Nylander

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

सवाल यह है कि क्लाइंट मशीन केबमैन के समय क्षेत्र में डीएसटी लागू होने के समय को कैसे निर्धारित किया जाए, तारीखों को कैसे प्रदर्शित किया जाए, वेब क्लाइंट पहले से ही आपके लिए संभालता है।
जॉन नाइलैंडर

आप जनवरी और जुलाई (या फरवरी और अगस्त, मार्च और सितंबर, आदि) के बीच जांच करते हैं क्योंकि वे 6 महीने अलग हैं।
kpull1

17

यह उत्तर स्वीकृत उत्तर के समान है, लेकिन Dateप्रोटोटाइप को ओवरराइड नहीं करता है , और केवल एक फ़ंक्शन कॉल का उपयोग करता है यह जांचने के लिए कि क्या डेलाइट सेविंग टाइम प्रभावी है, दो के बजाय।


यह विचार है कि, चूंकि कोई भी देश 7 महीने तक DST का पालन नहीं करता है [1] , ऐसे क्षेत्र में जो जनवरी में UTC के समय से DST की भरपाई करता है, वह जुलाई में भिन्न होगा।

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

हम तब जांचते हैं कि क्या दिनांक समयक्षेत्र उस न्यूनतम मूल्य के बराबर है। अगर ऐसा है, तो हम डीएसटी में हैं; अन्यथा हम नहीं हैं।

निम्न फ़ंक्शन इस एल्गोरिथ्म का उपयोग करता है। यह एक दिनांक ऑब्जेक्ट लेता है d, और trueयदि उस दिन के लिए डेलाइट बचत समय प्रभावी होता है, और falseयदि यह नहीं है , तो रिटर्न :

function isDST(d) {
    let jan = new Date(d.getFullYear(), 0, 1).getTimezoneOffset();
    let jul = new Date(d.getFullYear(), 6, 1).getTimezoneOffset();
    return Math.max(jan, jul) != d.getTimezoneOffset(); 
}

1
यह काम करता है, लेकिन अगर मौजूदा टाइमज़ोन में कोई डीएसटी नहीं है, तो यह भी सच होगा, जो सही नहीं है। यदि आप इसे स्विच करते हैं Math.max(...) != d.get...(), तो यह सही होगा यदि दिए गए समयक्षेत्र में डीएसटी मनाया जाता है और वर्तमान में डीएसटी में तारीख है। यदि DST नहीं देखा गया है या दिनांक मानक ऑफसेट से मेल खाता है, तो यह गलत होगा।
ग्रेसीज

12

मुझे आज भी इसी समस्या का सामना करना पड़ रहा था, लेकिन चूंकि हमारी दिन की बचत अमरीका से अलग-अलग समय पर शुरू होती है और रुकती है (कम से कम मेरी समझ से), मैंने थोड़ा अलग रास्ता इस्तेमाल किया।

var arr = [];
for (var i = 0; i < 365; i++) {
 var d = new Date();
 d.setDate(i);
 newoffset = d.getTimezoneOffset();
 arr.push(newoffset);
}
DST = Math.min.apply(null, arr);
nonDST = Math.max.apply(null, arr);

फिर आप बस DST और नॉन डीएसटी के साथ मौजूदा टाइमज़ोन ऑफसेट की तुलना करके देखते हैं कि कौन सा मैच होता है।


हम इसे वैसे ही करते हैं। यह है कि, वर्ष के समय का डीएसटी अपने लक्ष्य समय क्षेत्र में परिवर्तन करें, और वर्तमान दिन और सबसे हाल की परिवर्तन तिथि के लिए ऑफसेट गणना करें। वे या तो एक घंटे से अलग होंगे या बराबर होंगे (यह मानते हुए कि समय क्षेत्र एक घंटे की भरपाई है)।
हीथ

365 मानों को बनाने की आवश्यकता नहीं है, एक बाइनरी खोज दृष्टिकोण जो ऑफसेट में परिवर्तन के रूप में जल्द ही बंद हो जाता है निर्धारित किया जाना चाहिए बहुत अधिक कुशल, यहां तक ​​कि जहां दिन के उजाले की बचत नहीं देखी जाती है। ये सभी दृष्टिकोण यह मानते हैं कि जगहें हर साल दिन के उजाले को बचाती हैं, जो जरूरी नहीं कि सच हो। स्थान समय-समय पर डेलाइट सेविंग को अपनाते और छोड़ते हैं (हालांकि ECMAScript वर्तमान नियमों को मानता है, जो भी वे क्षेत्र में लागू होते हैं, हमेशा)।
2

2
रोब - आप एक द्विआधारी खोज के माध्यम से यह कैसे कर सकते हैं यदि आप नहीं जानते कि कहां खोज करना है (यानी वह स्थान जिसे आप ढूंढ रहे हैं, आप आर परीक्षण बिंदु से ऊपर या नीचे हैं?)
epeleg

9

शेल्डन ग्रिफिन द्वारा प्रदान किए गए समाधान पर मैट जोहानसन की टिप्पणी के आधार पर मैंने निम्नलिखित कोड बनाया:

    Date.prototype.stdTimezoneOffset = function() {
        var fy=this.getFullYear();
        if (!Date.prototype.stdTimezoneOffset.cache.hasOwnProperty(fy)) {

            var maxOffset = new Date(fy, 0, 1).getTimezoneOffset();
            var monthsTestOrder=[6,7,5,8,4,9,3,10,2,11,1];

            for(var mi=0;mi<12;mi++) {
                var offset=new Date(fy, monthsTestOrder[mi], 1).getTimezoneOffset();
                if (offset!=maxOffset) { 
                    maxOffset=Math.max(maxOffset,offset);
                    break;
                }
            }
            Date.prototype.stdTimezoneOffset.cache[fy]=maxOffset;
        }
        return Date.prototype.stdTimezoneOffset.cache[fy];
    };

    Date.prototype.stdTimezoneOffset.cache={};

    Date.prototype.isDST = function() {
        return this.getTimezoneOffset() < this.stdTimezoneOffset(); 
    };

यह सभी टिप्पणियों और पहले से सुझाए गए उत्तरों और विशेष रूप से इसे ध्यान में रखते हुए सभी दुनिया का सर्वश्रेष्ठ पाने की कोशिश करता है:

1) प्रति वर्ष stdTimezoneOffset के लिए परिणाम को कैश करता है ताकि आपको एक ही वर्ष में कई तिथियों का परीक्षण करते समय इसे पुनर्गणना करने की आवश्यकता न हो।

2) यह नहीं मानता है कि DST (यदि यह सभी में मौजूद है) आवश्यक रूप से जुलाई में है, और यह तब भी काम करेगा जब यह किसी बिंदु पर होगा और किसी स्थान पर किसी भी महीने होगा। हालाँकि प्रदर्शन-वार यह तेजी से काम करेगा अगर वास्तव में जुलाई (या महीनों के आसपास) वास्तव में डीएसटी है।

3) इससे भी बदतर स्थिति यह प्रत्येक महीने के पहले के getTimezoneOffset की तुलना करेगी। [और प्रति वर्ष एक बार परीक्षण करें]।

अभी भी यह धारणा बनी हुई है कि यदि डीएसटी की अवधि बड़ी है तो एक महीने में।

अगर कोई उस धारणा को दूर करना चाहता है तो वह लूप को कुछ और बदल सकता है जैसे कि हारून कोल द्वारा प्रदान की गई सॉलिन में क्या है - लेकिन मैं अभी भी आधे साल आगे कूदूंगा और दो अलग-अलग ऑफसेट मिलने पर लूप को तोड़ दूंगा]


4

Moment.js पुस्तकालय एक प्रदान करता है .isDst()अपने समय की वस्तुओं पर विधि।

यदि वर्तमान समय दिन के उजाले की बचत के समय में है, तो पल #DST की जाँच करता है।

moment([2011, 2, 12]).isDST(); // false, March 12 2011 is not DST
moment([2011, 2, 14]).isDST(); // true, March 14 2011 is DST

मैंने var क्षण की कोशिश की = आवश्यकता ('क्षण'); this.logger.info (पल ([2011, 2, 12])। isDST ()); this.logger.info (पल ([2011, 2, 14])। isDST ()); दोनों झूठे हैं
लोगन_

एक ही देश (जैसे एरिज़ोना राज्य) में भी, DST परिवर्तन की तारीखें देशों के बीच बदलती हैं । संयुक्त राज्य अमेरिका में यह 2011-03-13 पर था, जबकि जर्मनी में यह 2011-03-31 पर था। तो परिणाम के आधार पर अलग होगा समय क्षेत्र moment.js में काम करने के लिए कॉन्फ़िगर किया गया है।
डैनियल एफ

1
यह एरिज़ोना के राज्य के भीतर भी भिन्न है timeanddate.com/time/us/arizona-no-dst.html
डैनियल एफ

3

getTimezoneOffset()जावास्क्रिप्ट में विधि, एक ब्राउज़र में 00:00 समय क्षेत्र से ऑफसेट मिनट की संख्या देता है। उदाहरण के लिए, डेलाइट सेविंग्स (DST) में अमेरिका / न्यू_यॉर्क टाइम ज़ोन 300 नंबर देता है। 300 मिनट शून्य पर 5 घंटे का अंतर है। 300 मिनट 60 मिनट से विभाजित 5 घंटे है। हर बार ज़ोन की तुलना शून्य समय क्षेत्र, +00: 00 / Etc / GMT / ग्रीनविच समय से की जाती है।

एमडीएन वेब डॉक्स

अगली चीज़ जो आपको पता होनी चाहिए, वह यह है कि ऑफ़सेट वास्तविक समय क्षेत्र के विपरीत संकेत है।

समय क्षेत्र के बारे में जानकारी इंटरनेट असाइनमेंट नंबर प्राधिकरण (iana) द्वारा बनाए रखी जाती है

ियाना समय क्षेत्र

टाइम जोन की एक अच्छी तरह से स्वरूपित तालिका joda.org द्वारा आपूर्ति की जाती है

जोडा-टाइम टाइम जोन

+00: 00 या Etc / GMT ग्रीनविच समय है

सभी समय क्षेत्र +00: 00 / "आदि / GMT" / ग्रीनविच समय से ऑफसेट हैं

डेलाइट सेविंग टाइम गर्मियों में "नियमित" समय की तुलना में हमेशा पहले का समय होता है। आप अपनी घड़ियों को पतन के मौसम में वापस सेट करें। ("फॉल बैक" नारे को याद रखें कि क्या करना है)

इसलिए, डेलाइट सेविंग्स (सर्दियों) में अमेरिका / न्यू_यॉर्क का समय नियमित समय से एक घंटा पहले है। इसलिए, उदाहरण के लिए, गर्मियों में न्यूयॉर्क शहर में दोपहर में आम तौर पर शाम 5 बजे, अब डेलाइट सेविंग्स में 4 बजे अमेरिका / न्यू_यॉर्क समय है। "अमेरिका / न्यू_यॉर्क" समय का नाम "लॉन्ग फॉर्मेट" टाइम ज़ोन नाम है। अमेरिका का पूर्वी तट आमतौर पर अपने समय क्षेत्र को पूर्वी मानक समय (ईएसटी) कहता है

यदि आप आज के समय क्षेत्र की तुलना किसी अन्य तिथि के समय क्षेत्र ऑफसेट से करना चाहते हैं, तो आपको यह जानना होगा कि समय क्षेत्र के समय का गणितीय संकेत (+/- "सकारात्मक / नकारात्मक") समय क्षेत्र के विपरीत है।

Joda.org पर टाइम ज़ोन तालिका देखें और "अमेरिका / न्यू_यॉर्क" के लिए समय क्षेत्र खोजें। यह मानक ऑफसेट के सामने एक नकारात्मक संकेत होगा।

पृथ्वी अपनी धुरी पर काउंटर-क्लॉकवाइज घूमती है। ग्रीनविच में सूर्योदय देखने वाला व्यक्ति सूर्योदय देखता है 5 घंटे पहले न्यूयॉर्क शहर में कोई व्यक्ति सूर्योदय देखेगा। और अमेरिका के वेस्ट कोस्ट पर कोई सूर्योदय देखेगा उसके बाद अमेरिका के पूर्वी तट पर कोई व्यक्ति सूर्योदय देखता है।

वहाँ एक कारण है कि आप यह सब जानने की जरूरत है। ताकि आप तार्किक रूप से यह निर्धारित कर पाएंगे कि कुछ जावास्क्रिप्ट कोड को सही ढंग से डीएसटी का दर्जा मिल रहा है या नहीं, साल के अलग-अलग समय में हर समय क्षेत्र का परीक्षण करने की आवश्यकता के बिना।

कल्पना कीजिए कि यह न्यूयॉर्क शहर में नवंबर है, और घड़ियों को एक घंटे पहले सेट किया गया है। न्यूयॉर्क शहर में गर्मियों में, ऑफसेट 240 मिनट या 4 घंटे है।

आप जुलाई में होने वाली एक तारीख बनाकर और फिर ऑफसेट प्राप्त करके इसका परीक्षण कर सकते हैं।

var July_Date = new Date(2017, 6, 1);
var july_Timezone_OffSet = July_Date.getTimezoneOffset();

console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)

ब्राउज़र के डेवलपर टूल कंसोल लॉग में क्या प्रिंट होगा?

उत्तर है: २४०

तो, अब आप जनवरी में एक तारीख बना सकते हैं और देख सकते हैं कि सर्दियों के मौसम के लिए एक समय क्षेत्र ऑफसेट के लिए आपका ब्राउज़र क्या देता है।

var Jan_Date = new Date(2017, 0, 1);//Month is zero indexed - Jan is zero
var jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();

console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)

उत्तर है: 300

जाहिर है 300 240 से बड़ा है। तो, इसका क्या मतलब है? क्या आपको ऐसा कोड लिखना चाहिए जो सर्दियों के ऑफसेट के लिए परीक्षण गर्मियों के ऑफसेट से बड़ा हो? या गर्मियों में ऑफसेट सर्दियों की तुलना में कम है? यदि गर्मियों और सर्दियों के समय क्षेत्र के बीच अंतर है, तो आप मान सकते हैं कि इस समय क्षेत्र के लिए डीएसटी का उपयोग किया जा रहा है। लेकिन यह आपको नहीं बताता है कि क्या आज ब्राउज़र समय क्षेत्र के लिए डीएसटी का उपयोग कर रहा है। इसलिए, आपको आज के लिए समय क्षेत्र की भरपाई करने की आवश्यकता होगी।

var today = new Date();
var todaysTimeZone = today.getTimezoneOffset();

console.log('todaysTimeZone : ' + todaysTimeZone)

जवाब है: ? - वर्ष के समय पर निर्भर करता है

यदि आज का समय क्षेत्र ऑफसेट और ग्रीष्मकालीन समय क्षेत्र ऑफसेट समान है, और गर्मियों और सर्दियों का समय क्षेत्र भिन्न हैं, तो तार्किक कटौती द्वारा, आज DST में नहीं होना चाहिए।

क्या आप गर्मियों और सर्दियों के समय क्षेत्र की तुलना करने से चूक सकते हैं, (यह जानने के लिए कि क्या इस समय क्षेत्र के लिए डीएसटी का उपयोग किया जाता है) और बस आज के समय क्षेत्र की तुलना गर्मियों की ऑफसेट ऑफसेट से करें, और हमेशा सही उत्तर प्राप्त करें?

today's TZ Offset !== Summer TZ Offset

खैर, आज सर्दी या गर्मी में है? यदि आप जानते थे कि आप निम्नलिखित तर्क को लागू कर सकते हैं:

if ( it_is_winter && ( todays_TZ_Offset !== summer_TZ_Offset) {
  var are_We_In_DST = true;
}

लेकिन समस्या यह है कि आप नहीं जानते कि आज की तारीख सर्दियों या गर्मियों में है। डीएसटी शुरू होने और रुकने पर हर बार जोन के अपने नियम हो सकते हैं। आपको दुनिया में हर समय क्षेत्र के लिए हर समय क्षेत्र के नियमों का ध्यान रखना होगा। तो, अगर एक बेहतर और आसान तरीका है तो आप इसे बेहतर और आसान तरीका भी कर सकते हैं।

हमारे पास जो कुछ बचा है, वह यह है कि आपको यह जानने की जरूरत है कि क्या यह समय क्षेत्र डीएसटी का उपयोग करता है, और फिर आज के समय क्षेत्र की तुलना ग्रीष्मकालीन क्षेत्र क्षेत्र ऑफसेट से करें। वह आपको हमेशा एक विश्वसनीय उत्तर देगा।

अंतिम तर्क है:

if ( DST_Is_Used_In_This_Time_Zone && ( todays_TZ_Offset !== summer_TZ_Offset) {
  var are_We_In_DST = true;
}

यह निर्धारित करने के लिए फ़ंक्शन कि ब्राउज़र में समय क्षेत्र DST का उपयोग करता है:

function is_DST_Used_In_This_TimeZone() {
  var Jan_Date, jan_Timezone_OffSet, July_Date, july_Timezone_OffSet 
      offsetsNotEqual, thisYear, today;

  today = new Date();//Create a date object that is now
  thisYear = today.getFullYear();//Get the year as a number

  Jan_Date = new Date(thisYear, 0, 1);//Month is zero indexed - Jan is zero
  jan_Timezone_OffSet = Jan_Date.getTimezoneOffset();

  console.log('jan_Timezone_OffSet: ' + jan_Timezone_OffSet)

  July_Date = new Date(thisYear, 6, 1);
  july_Timezone_OffSet = July_Date.getTimezoneOffset();

  console.log('july_Timezone_OffSet: ' + july_Timezone_OffSet)

  offsetsNotEqual = july_Timezone_OffSet !== jan_Timezone_OffSet;//True if not equal

  console.log('offsetsNotEqual: ' + offsetsNotEqual);

  return offsetsNotEqual;//If the offsets are not equal for summer and
       //winter then the only possible reason is that DST is used for
       //this time zone
}

Dateandtime.com के अनुसार डीएसटी 2019 में 10 मार्च से शुरू हुआ था, और इसलिए गर्मियों में है, न कि सर्दियों में, और न्यूयॉर्क का डीएसटी ऑफसेट -4 है, -5 नहीं।
jk7

यदि उत्तर में सुधार या सुधार किए जाने की आवश्यकता है तो कृपया एक संपादन करें, और इसकी समीक्षा की जाएगी।
एलन वेल्स

2

Moment.js ( https://momentjs.com/ ) का उपयोग करें

moment().isDST(); यदि डे लाइट बचत देखी जाती है तो आपको देंगे।

इसके अलावा यह आपके लिए सापेक्ष समय की गणना करने के लिए सहायक कार्य करता है। आपको मैन्युअल गणनाएँ करने की आवश्यकता नहीं हैmoment("20200105", "YYYYMMDD").fromNow();


1

आप करीब हैं, लेकिन थोड़ा दूर हैं। आपको अपने स्वयं के समय की गणना करने की आवश्यकता नहीं है क्योंकि यह आपकी अपनी घड़ी का परिणाम है। यह पता लगा सकता है कि आप अपने स्थान पर दिन के समय की बचत का उपयोग कर रहे हैं, लेकिन ऑफसेट द्वारा निर्मित दूरस्थ स्थान के लिए नहीं:

newDateWithOffset = new Date(utc + (3600000*(offset)));

यह तब भी गलत होगा और एक घंटे से अगर वे डीएसटी में हैं। आपको दूरस्थ समय खाते की आवश्यकता है यदि वे वर्तमान में अपने डीएसटी के अंदर हैं या नहीं और तदनुसार समायोजित करें। इसकी गणना करने का प्रयास करें और अपनी घड़ी को बदल दें - 2/1/2015 को कहने दें और घड़ी को एक घंटे में रीसेट करें जैसे कि DST के बाहर। फिर एक जगह के लिए ऑफसेट की गणना करें जो अभी भी 2 घंटे पीछे होनी चाहिए। यह दो घंटे की खिड़की से एक घंटे आगे दिखाई देगा। आपको अभी भी घंटे के लिए खाते और समायोजित करने की आवश्यकता होगी। मैंने इसे NY और डेनवर के लिए किया और हमेशा डेनवर में गलत (घंटे के आगे) जाना।


1

मैंने पाया है कि यहां वर्णित कुछ अवधारणाओं के साथ मोमेंट.जेएस लाइब्रेरी का उपयोग करना (जनवरी से जून की तुलना) बहुत अच्छी तरह से काम करता है।

यह साधारण फ़ंक्शन लौटेगा कि क्या समय-सारणी है कि उपयोगकर्ता डेलाइट सेविंग टाइम के अवलोकन में है:

function HasDST() {
    return moment([2017, 1, 1]).isDST() != moment([2017, 6, 1]).isDST();
}

यह जांचने का एक सरल तरीका है कि यह काम करता है (विंडोज पर) अपने टाइमज़ोन को एक गैर डीएसटी ज़ोन में बदलना है, उदाहरण के लिए एरिज़ोना झूठा वापस आ जाएगा, जबकि ईएसटी या पीएसटी सच वापस आ जाएगी।

यहां छवि विवरण दर्ज करें


1

भविष्य-सबूत समाधान जो सभी समय क्षेत्रों में काम करता है

  1. xदिन के उजाले में फैक्टरिंग के बिना ब्याज की वर्ष में अपेक्षित संख्या होने दें ।
  2. आज्ञा देना yके बाद से मिलीसेकेंड की संख्या हो युग ब्याज की तारीख से वर्ष की शुरुआत से।
  3. आज्ञा देना zके बाद से मिलीसेकेंड की संख्या हो युग पूर्ण तिथि और ब्याज की समय की
  4. चलो tदोनों के घटाव हो xऔर yसे z: z - y - x। डीएसटी की वजह से इसकी भरपाई होती है।
  5. यदि tशून्य है, तो डीएसटी प्रभाव में नहीं है। यदि tशून्य नहीं है, तो डीएसटी प्रभाव में है।

(function(){"use strict";
function dstOffsetAtDate(dateInput) {
    var fullYear = dateInput.getFullYear()|0;
	// "Leap Years are any year that can be exactly divided by 4 (2012, 2016, etc)
 	//   except if it can be exactly divided by 100, then it isn't (2100,2200,etc)
 	//	  except if it can be exactly divided by 400, then it is (2000, 2400)"
	// (https://www.mathsisfun.com/leap-years.html).
    var isLeapYear = ((fullYear & 3) | (fullYear/100 & 3)) === 0 ? 1 : 0;
	// (fullYear & 3) = (fullYear % 4), but faster
    //Alternative:var isLeapYear=(new Date(currentYear,1,29,12)).getDate()===29?1:0
    var fullMonth = dateInput.getMonth()|0;
    return (
        // 1. We know what the time since the Epoch really is
        (+dateInput) // same as the dateInput.getTime() method
        // 2. We know what the time since the Epoch at the start of the year is
        - (+new Date(fullYear, 0, 0)) // day defaults to 1 if not explicitly zeroed
        // 3. Now, subtract what we would expect the time to be if daylight savings
        //      did not exist. This yields the time-offset due to daylight savings.
        - ((
            ((
                // Calculate the day of the year in the Gregorian calendar
                // The code below works based upon the facts of signed right shifts
                //    • (x) >> n: shifts n and fills in the n highest bits with 0s 
                //    • (-x) >> n: shifts n and fills in the n highest bits with 1s
                // (This assumes that x is a positive integer)
                (31 & ((-fullMonth) >> 4)) + // January // (-11)>>4 = -1
                ((28 + isLeapYear) & ((1-fullMonth) >> 4)) + // February
                (31 & ((2-fullMonth) >> 4)) + // March
                (30 & ((3-fullMonth) >> 4)) + // April
                (31 & ((4-fullMonth) >> 4)) + // May
                (30 & ((5-fullMonth) >> 4)) + // June
                (31 & ((6-fullMonth) >> 4)) + // July
                (31 & ((7-fullMonth) >> 4)) + // August
                (30 & ((8-fullMonth) >> 4)) + // September
                (31 & ((9-fullMonth) >> 4)) + // October
                (30 & ((10-fullMonth) >> 4)) + // November
                // There are no months past December: the year rolls into the next.
                // Thus, fullMonth is 0-based, so it will never be 12 in Javascript
                
                (dateInput.getDate()|0) // get day of the month
				
            )&0xffff) * 24 * 60 // 24 hours in a day, 60 minutes in an hour
            + (dateInput.getHours()&0xff) * 60 // 60 minutes in an hour
            + (dateInput.getMinutes()&0xff)
        )|0) * 60 * 1000 // 60 seconds in a minute * 1000 milliseconds in a second
        - (dateInput.getSeconds()&0xff) * 1000 // 1000 milliseconds in a second
        - dateInput.getMilliseconds()
    );
}

// Demonstration:
var date = new Date(2100, 0, 1)
for (var i=0; i<12; i=i+1|0, date.setMonth(date.getMonth()+1|0))
    console.log(date.getMonth()+":\t"+dstOffsetAtDate(date)/60/60/1000+"h\t"+date);
date = new Date(1900, 0, 1);
for (var i=0; i<12; i=i+1|0, date.setMonth(date.getMonth()+1|0))
    console.log(date.getMonth()+":\t"+dstOffsetAtDate(date)/60/60/1000+"h\t"+date);

// Performance Benchmark:
console.time("Speed of processing 16384 dates");
for (var i=0,month=date.getMonth()|0; i<16384; i=i+1|0)
    date.setMonth(month=month+1+(dstOffsetAtDate(date)|0)|0);
console.timeEnd("Speed of processing 16384 dates");
})();

मेरा मानना ​​है कि उपरोक्त कोड स्निपेट कई कारणों से यहां पोस्ट किए गए अन्य सभी उत्तरों से बेहतर है।

  • यह उत्तर सभी समय क्षेत्रों, यहां तक ​​कि अंटार्कटिका / केसी में भी काम करता है ।
  • डेलाइट बचत बहुत परिवर्तन के अधीन है। यह हो सकता है कि अब से 20 साल बाद, कुछ देश में सामान्य के बजाय 3 डीएसटी अवधि हो सकती है। यह कोड उस स्थिति को हैंडल करता है, जो डीएसटी की मिलीसेकंड में ऑफसेट करता है, न कि केवल डीएसटी प्रभाव में है या नहीं।
  • वर्ष के महीनों का आकार और जिस तरह से लीप इयर्स काम करते हैं वह हमारे समय को सूरज के साथ ट्रैक पर रखने में पूरी तरह से फिट बैठता है। हेक, यह इतनी अच्छी तरह से काम करता है कि हम कभी भी बस यहाँ और वहाँ मात्र सेकंड समायोजित करते हैं । हमारे लीप वर्ष की वर्तमान प्रणाली 24 फरवरी, 1582 से प्रभावी रही है और संभवतः भविष्य के लिए प्रभावी रहेगी।
  • यह कोड टाइमज़ोन में काम करता है जो डीएसटी का उपयोग नहीं करते हैं।
  • यह कोड ऐतिहासिक समय में काम करता है जब डीएसटी लागू किया गया था (जैसे कि 1900)।
  • यह कोड अधिकतम पूर्णांक-अनुकूलित है और आपको तंग लूप में कॉल करने पर कोई समस्या नहीं होनी चाहिए। ऊपर कोड स्निपेट चलाने के बाद, प्रदर्शन बेंचमार्क देखने के लिए आउटपुट के नीचे स्क्रॉल करें। मेरा कंप्यूटर क्रोम पर ~ 97ms में 16384 तारीखों को संसाधित करने में सक्षम है।

हालाँकि, यदि आप 2 DST से अधिक अवधि के लिए तैयारी नहीं कर रहे हैं, तो नीचे दिए गए कोड का उपयोग यह निर्धारित करने के लिए किया जा सकता है कि DST एक बूलियन के रूप में प्रभाव में है या नहीं।

function isDaylightSavingsInEffect(dateInput) {
    // To satisfy the original question
    return dstOffsetAtDate(dateInput) !== 0;
}

0

मुझे हाल ही में UTC और DST के साथ डेट स्ट्रिंग बनाने की आवश्यकता थी, और शेल्डन के उत्तर के आधार पर मैंने इसे एक साथ रखा:

Date.prototype.getTimezone = function(showDST) {
    var jan = new Date(this.getFullYear(), 0, 1);
    var jul = new Date(this.getFullYear(), 6, 1);

    var utcOffset = new Date().getTimezoneOffset() / 60 * -1;
    var dstOffset = (jan.getTimezoneOffset() - jul.getTimezoneOffset()) / 60;

    var utc = "UTC" + utcOffset.getSign() + (utcOffset * 100).preFixed(1000);
    var dst = "DST" + dstOffset.getSign() + (dstOffset * 100).preFixed(1000);

    if (showDST) {
        return utc + " (" + dst + ")";
    }

    return utc;
}
Number.prototype.preFixed = function (preCeiling) {
    var num = parseInt(this, 10);
    if (preCeiling && num < preCeiling) {
        num = Math.abs(num);
        var numLength		 = num.toString().length;
        var preCeilingLength = preCeiling.toString().length;
        var preOffset		 = preCeilingLength - numLength;
        for (var i = 0; i < preOffset; i++) {
            num = "0" + num;
        }
    }
    return num;
}
Number.prototype.getSign = function () {
    var num	 = parseInt(this, 10);
    var sign = "+";
    if (num < 0) {
        sign = "-";
    }
    return sign;
}

document.body.innerHTML += new Date().getTimezone() + "<br>";
document.body.innerHTML += new Date().getTimezone(true);
<p>Output for Turkey (UTC+0200) and currently in DST: &nbsp; UTC+0300 (DST+0100)</p>
<hr>


0

वहाँ का उपयोग कर एक मुद्दा है Date.toString().indexOf('Daylight Time') > -1

"" + new Date()

Sat Jan 01 100050 00:00:00 GMT-0500 (पूर्वी मानक समय)

"" + new Date(...)

सूर्य मई 01 100033 00:00:00 GMT-0400 (पूर्वी डेलाइट समय)

यह सभी ब्राउज़रों के साथ संगत लगता है।


हां, यह दुनिया भर में काम नहीं करता है। यूरोप में गर्मियों में, आप मिल"Thu Jul 02 2020 14:07:01 GMT+0200 (Central European Summer Time)"
तादेज Krevh

0

ईएस 6 स्टाइल

Math.min(...[0, 6].map(v => new Date(95, v, 1).getTimezoneOffset() * -1));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.