क्या जावास्क्रिप्ट तिथि वस्तु हमेशा एक दिन की होती है?


238

मेरे जावा स्क्रिप्ट ऐप में मेरे पास प्रारूप में संग्रहीत तिथि है जैसे:

2011-09-24

अब जब मैं एक नया दिनांक ऑब्जेक्ट बनाने के लिए उपरोक्त मूल्य का उपयोग करने का प्रयास करता हूं (इसलिए मैं एक अलग प्रारूप में तारीख को पुनः प्राप्त कर सकता हूं), तो तारीख हमेशा एक दिन की छुट्टी से वापस आती है। निचे देखो:

var doo = new Date("2011-09-24");
console.log(doo);

लॉग:

Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)

11
जावास्क्रिप्ट की तिथि वर्ग एक तारीख का प्रतिनिधित्व नहीं करता है, यह टाइमस्टैम्प (जावा में समान) का प्रतिनिधित्व करता है। इसे एक तारीख बनाने के लिए, यह एक समय क्षेत्र का उपयोग करता है और यह आपकी समस्या का कारण है। यह जीएमटी / यूटीसी टाइमज़ोन (24 सितंबर 2011, 00 : 00 यूटीसी) के साथ इसे पार्स करता है और फिर इसे 4 घंटे (23 सितंबर 2011, 20 : 00 जीएमटी -0400) के अलग-अलग टाइमज़ोन के साथ आउटपुट करता है ।
कोडो

2
मुझे "अमान्य दिनांक" मिलता है। '-' वर्णों को '/' वर्णों से बदलें और पुनः प्रयास करें। या दिनांक को उसके बिट्स में विभाजित करें और घटकों को व्यक्तिगत रूप से सेट करें (यदि आप ऐसा करते हैं, तो महीने की संख्या से 1 घटाएं)।
रोबग

@ कोडो - हां, अच्छा जवाब। ECMA-262 15.9.1.15 लागू होता है। ओपी को "2011-09-24T20: 00: 00-04: 00" या इसी तरह का उपयोग करना चाहिए।
रॉब

1
मैंने पाया कि प्रारूप "24 सितंबर 2011" उचित तारीख को वापस कर देगा। स्पष्टीकरण के लिए यहाँ देखें: stackoverflow.com/questions/2587345/javascript-date-parse
christurnerio

जवाबों:


98

ध्यान दें कि पूर्वी डेलाइट समय है -4 hoursऔर आप जिस तारीख को वापस आ रहे हैं उस पर घंटे हैं 20

20h + 4h = 24h

जो 2011-09-24 की मध्यरात्रि है। दिनांक UTC (GMT) में पार्स किया गया था क्योंकि आपने बिना किसी समय क्षेत्र संकेतक के केवल दिनांक स्ट्रिंग प्रदान की थी। यदि आपने एक तारीख / समय स्ट्रिंग w / o के बजाय एक संकेतक दिया था ( new Date("2011-09-24T00:00:00")), तो यह आपके स्थानीय समय क्षेत्र में पार्स किया गया होता। (ऐतिहासिक रूप से वहां विसंगतियां रही हैं, कम से कम नहीं क्योंकि कल्पना एक से अधिक बार बदल गई, लेकिन आधुनिक ब्राउज़र ठीक होना चाहिए; या आप हमेशा एक टाइमज़ोन संकेतक शामिल कर सकते हैं।)

आपको सही तिथि मिल रही है, आपने कभी सही समय क्षेत्र निर्दिष्ट नहीं किया है।

आप दिनांक मानों का उपयोग करने की जरूरत है, तो आप उपयोग कर सकते हैं getUTCDate()या अन्य के किसी भी getUTC*()कार्य करता है :

var d,
    days;
d = new Date('2011-09-24');
days = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'];
console.log(days[d.getUTCDay()]);

24
आप "सही टाइमज़ोन निर्दिष्ट कैसे करते हैं"? दिनांक निर्माणकर्ता हमेशा UTC के रूप में दिनांक स्ट्रिंग की व्याख्या करता है, लेकिन फिर टाइमज़ोन के लिए समायोजित करता है। मैं `नई तिथि '(' 2012-01-02 EDT ') भी कर सकता हूं और फिर भी दिन के उजाले के लिए ऑफसेट लागू करने के कारण पिछले दिन इसे वापस ले जाता हूं, जिसका कोई मतलब नहीं है क्योंकि अगर मैंने आपको बताया है कि तारीख के अनुसार EDT के वर्तमान स्थानीय समयक्षेत्र, फिर उस पर एक अतिरिक्त ऑफसेट लागू न करें। मैंने इसे टाइमजोन EDT बताया था लेकिन यह अभी भी एक अतिरिक्त ऑफसेट लागू करता है जो इसे एक दिन वापस ले जाता है।
एरोनल्स

1
@ एरोनएलएस, डेलाइट सेविंग टाइम (जिसे समर टाइम भी कहा जाता है) , जनवरी में लागू होने वाला टाइमज़ोन EDTहै । EST
zzzzBov

1
इसे एक स्ट्रिंग से सिर्फ UTC के रूप में बनाना जो मैं करना चाहूंगा, इसलिए मैंने पूछा कि "आप सही टाइमजोन कैसे निर्दिष्ट करते हैं?" जहाँ आपने कहा था "आपने कभी सही समय क्षेत्र निर्दिष्ट नहीं किया है।" अगर मैं new Date('2012-01-01 GMT')इसे अभी भी एक ऑफसेट लागू करता हूं क्योंकि यह इसे उपयोगकर्ता की स्थानीय तारीख के समय में परिवर्तित करता है।
आरोनॉल्स २ Aar

7
@AaronLS, यदि आप get*विधियों का उपयोग करने के लिए मजबूर हैं और अज्ञात टाइमज़ोन ऑफ़सेट सहित सही तिथि / समय वापस करने के लिए इसकी आवश्यकता है, तो बस अज्ञात टाइमज़ोन ऑफ़सेट में जोड़ें: d = new Date('2013-01-08 GMT'); d.setMinutes(d.getMinutes() + d.getTimezoneOffset());यह उपयोगकर्ता के स्थान पर दिनांक को सामान्य कर देगा ताकि .get*विधियाँ वापस आ जाएँ अपेक्षित मूल्य। इसके .getUTC*बाद तरीके गलत होंगे, इसलिए सावधान रहें।
zzzzBov

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

252

रहे हैं कई पागल चीजें हैं जो एक जे एस के साथ हो , DATE उद्देश्य यह है कि परिवर्तित तार, उदाहरण के लिए आपके द्वारा दी गई निम्नलिखित तिथि पर विचार

नोट: निम्नलिखित उदाहरण आपके समयक्षेत्र और वर्तमान समय के आधार पर वन डे ऑफ हो सकते हैं या नहीं भी हो सकते हैं ।

new Date("2011-09-24"); // Year-Month-Day
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.

हालांकि, अगर हम स्ट्रिंग प्रारूप को महीना-दिन-वर्ष में पुनर्व्यवस्थित करते हैं ...

new Date("09-24-2011");
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

एक और अजीब

new Date("2011-09-24");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF AS BEFORE.

new Date("2011/09/24"); // change from "-" to "/".
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

नई तारीख बनाते समय हम आपकी तिथि "2011-09-24" में आसानी से हाइफ़न बदल सकते हैं

new Date("2011-09-24".replace(/-/g, '\/')); // => "2011/09/24".
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

क्या होगा अगर हमारे पास "2011-09-24T00: 00: 00" जैसी तारीख का तार था

new Date("2011-09-24T00:00:00");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.

अब हाइफ़न को पहले स्लैश में बदल दें ; क्या होता है?

new Date("2011/09/24T00:00:00");
// => Invalid Date

मुझे आमतौर पर दिनांक २०११-०९ -२४ टीटी ००: ००: ०० का प्रबंधन करना होता है।

new Date("2011-09-24T00:00:00".replace(/-/g, '\/').replace(/T.+/, ''));
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

अपडेट करें

यदि आप दिनांक निर्माता को अलग-अलग तर्क प्रदान करते हैं, तो आप नीचे वर्णित अनुसार अन्य उपयोगी आउटपुट प्राप्त कर सकते हैं

नोट: तर्क टाइप संख्या या स्ट्रिंग के हो सकते हैं। मैं मिश्रित मूल्यों के साथ उदाहरण दिखाता हूँ।

किसी दिए गए वर्ष का पहला महीना और दिन प्राप्त करें

new Date(2011, 0); // Normal behavior as months in this case are zero based.
=> // Sat Jan 01 2011 00:00:00 GMT-0700 (MST)

साल का आखिरी महीना और दिन पाएं

new Date((2011 + 1), 0, 0); // The second zero roles back one day into the previous month's last day.
=> // Sat Dec 31 2011 00:00:00 GMT-0700 (MST)

संख्या का उदाहरण, स्ट्रिंग तर्क। ध्यान दें महीना मार्च है क्योंकि शून्य आधारित महीने फिर से।

new Date(2011, "02"); 
=> // Tue Mar 01 2011 00:00:00 GMT-0700 (MST)

अगर हम ऐसा ही करते हैं, लेकिन शून्य के दिन के साथ, हम कुछ अलग करते हैं।

new Date(2011, "02", 0); // again the zero roles back from March to the last day of February.
=> // Mon Feb 28 2011 00:00:00 GMT-0700 (MST)

किसी भी वर्ष और महीने के तर्क में शून्य का दिन जोड़ने से पिछले महीने का अंतिम दिन मिलेगा। यदि आप ऋणात्मक संख्याओं के साथ जारी रखते हैं तो आप एक और दिन वापस आना जारी रख सकते हैं

new Date(2011, "02", -1);
=> // Sun Feb 27 2011 00:00:00 GMT-0700 (MST)

12
इससे वास्तव में मुझे सबसे अच्छी मदद मिली। मैंने अपने डेटा के अंत में .replace (/ - / g, '\ /') जोड़ा। (/ /। + /, '') जब मैंने एक नई तारीख की। सुपर आसान!
डेविन प्रेजियन

64
वाह - जावास्क्रिप्ट बहुत असंगत है।
Psparrow

2
आज शाम एक चुटकी में .replace () कॉल वास्तव में मदद करता है।
अप्रचार

2
हाँ, मैंने यह सब परीक्षण किया है, और वास्तव में अजीब है।
चिन्तन आदित्य

26
यह सब अंतर्निहित Date.parse के व्यवहार के कारण होता है () आईएसओ 8601 का पालन करने की कोशिश कर रहा है। जब दिनांक स्ट्रिंग yyyy-mm-dd प्रारूप का अनुसरण करता है, तो इसे अनुमानित UTC 00:00 के साथ ISO 8601 माना जाता है। जब स्ट्रिंग प्रारूप से भटक जाती है (जैसे कि हाइफ़न के बजाय mm-dd-yyyy या स्लैश), तो यह RFC 2822 के अनुसार शिथिल पार्सर पर वापस आ जाता है जो समयक्षेत्र के अनुपस्थित होने पर स्थानीय समय का उपयोग करता है। बेशक, यह सब एक औसत व्यक्ति के लिए काफी रहस्यमय होगा।
मिज़स्तिक

71

दिनांक को सामान्य करने और अवांछित ऑफ़सेट को समाप्त करने के लिए (यहाँ परीक्षण किया गया: https://jsfiddle.net/7xp1xL5m/ ):

var doo = new Date("2011-09-24");
console.log(  new Date( doo.getTime() + Math.abs(doo.getTimezoneOffset()*60000) )  );
// Output: Sat Sep 24 2011 00:00:00 GMT-0400 (Eastern Daylight Time)

यह भी इसी तरह का श्रेय @tpartee (यहाँ परीक्षण किया गया: https://jsfiddle.net/7xp1xL5m/1/ ) को देता है:

var doo = new Date("2011-09-24");
console.log( new Date( doo.getTime() - doo.getTimezoneOffset() * -60000 )  );

यह मेरे लिए था - मुझे एक एपीआई से तारीखों के साथ काम करना था, फिर उन्हें क्रमबद्ध करना / तुलना करना, इसलिए केवल टाइमज़ोन ऑफसेट को जोड़ना सबसे अच्छा काम करता है।
चकेड़ा

इसने मेरे लिए काम किया सिवाय इसके कि मुझे टाइमजोन ओफ़्सेट को घटाना था, इसे नहीं जोड़ना
ErikAGriffin

@ErikAGriffin आप GMT-0X00 के बजाय एक सकारात्मक समय क्षेत्र, IE GMT + 0X00 में हैं?
एरोनल्स

मैंने कुछ ऐसा ही किया है:doo.setMinutes(doo.getMinutes() + doo.getTimezoneOffset())
डिसिडेंट रेज

2
@AaronLS आप सही रास्ते पर थे लेकिन थोड़ा गलत तर्क। टीबी की भरपाई करने के लिए सही तर्क की भरपाई होती है: कंसोल.लॉग (नई तिथि (doo.getTime () - doo.getTimezoneOffset () * -60000)); - ऑफसेट का चिन्ह महत्वपूर्ण है और इसे दूर नहीं किया जा सकता है, लेकिन आपको सुधार के लिए व्युत्क्रम चिन्ह की भी आवश्यकता होती है, इसलिए हम लागू करने के लिए व्युत्क्रम चिन्ह के लिए ऑफसेट को -60000 से गुणा करते हैं।
तपती

28

यदि आप स्थानीय समय क्षेत्र में किसी तिथि का घंटा ० प्राप्त करना चाहते हैं, तो Dateनिर्माणकर्ता को अलग-अलग दिनांक भागों को पास करें ।

new Date(2011,08,24); // month value is 0 based, others are 1 based.

26

बस यह जोड़ना चाहते हैं कि स्पष्ट रूप से स्ट्रिंग के अंत में एक जगह जोड़ना निर्माण के लिए यूटीसी का उपयोग करेगा।

new Date("2016-07-06")
> Tue Jul 05 2016 17:00:00 GMT-0700 (Pacific Daylight Time)

new Date("2016-07-06 ")
> Wed Jul 06 2016 00:00:00 GMT-0700 (Pacific Daylight Time)

संपादित करें: यह अनुशंसित समाधान नहीं है, बस एक वैकल्पिक उत्तर है। कृपया इस दृष्टिकोण का उपयोग न करें क्योंकि यह बहुत अस्पष्ट है कि क्या हो रहा है। ऐसे कई तरीके हैं जिनसे कोई गलती से बग को दूर कर सकता है।


अंत में स्थान के साथ उदाहरण के लिए, कंसोल "अमान्य दिनांक = $ 2" लौटाता है
ब्रायन जोखिम

1
बहुत अच्छा काम करता है! नई तिथि (data.Date + "") .toLocaleDateString ("en-US")
Nakres

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

25

मेरा मानना ​​है कि यह समय-क्षेत्र समायोजन के साथ करना है। आपके द्वारा बनाई गई तारीख GMT में है और डिफ़ॉल्ट समय आधी रात है, लेकिन आपका समयक्षेत्र EDT है, इसलिए यह 4 घंटे घटाता है। यह सत्यापित करने के लिए प्रयास करें:

var doo = new Date("2011-09-25 EDT");

3
यह यहां सबसे अच्छा जवाब है। प्रोग्रामेटिक रूप से परिवर्तित करने के बजाय अंतर्निहित समयक्षेत्र स्थानीयकरण स्ट्रिंग्स का उपयोग करने के लिए + 1 मिलियन।
17

2
यह एक मदद करता है। यह इस तरह से काम करता है: $ गुंजाइश .at = नई तिथि (datestring + 'EDT')। EDT और EST के बीच अंतर पर ध्यान दें: लिंक
Weihui Guo

मुझे नहीं पता कि पर्दे के पीछे क्या हो रहा है, लेकिन यह पूरी तरह से काम करता है।
the_haystacker

यह मैं कहूंगा कि उत्तरों का सबसे सरल और कम कोड सुधार है।
माइकल

धन्यवाद, मैं अपने लिए सबसे अच्छा तरीका मानता हूं।
जैंडरसन कॉन्स्टेंटिनो

11

आपका मुद्दा विशेष रूप से समय क्षेत्र के साथ है। नोट भाग GMT-0400- आप GMT से 4 घंटे पीछे हैं। यदि आप प्रदर्शित दिनांक / समय में 4 घंटे जोड़ते हैं, तो आपको आधी रात 2011/09/24 को मिल जाएगी। toUTCString()GMT स्ट्रिंग प्राप्त करने के बजाय विधि का उपयोग करें :

var doo = new Date("2011-09-24");
console.log(doo.toUTCString());

7

यह शायद एक अच्छा जवाब नहीं है, लेकिन मैं सिर्फ इस मुद्दे के साथ अपने अनुभव को साझा करना चाहता हूं।

मेरा ऐप विश्व स्तर पर utc की तारीख को 'YYYY-MM-DD' प्रारूप के साथ उपयोग करता है, जबकि डेटपिकर प्लगइन मैं केवल js की तारीख का उपयोग करता हूं, मेरे लिए utc और js दोनों पर विचार करना कठिन है। इसलिए जब मैं एक 'YYYY-MM-DD' फॉर्मेट डेट को अपनी डेटपिकर के पास भेजना चाहता हूं, तो मैं सबसे पहले इसे क्षण भर में 'MM / DD / YYYY' फॉर्मेट में बदल देता हूं। सही बात। अपने उदाहरण के लिए

var d = new Date('2011-09-24'); // d will be 'Fri Sep 23 2011 20:00:00 GMT-0400 (EDT)' for my lacale
var d1 = new Date('09/24/2011'); // d1 will be 'Sat Sep 24 2011 00:00:00 GMT-0400 (EDT)' for my lacale

जाहिरा तौर पर d1 वही है जो मैं चाहता हूं। आशा है कि यह कुछ लोगों के लिए मददगार होगा।


1
जैसा आपने किया था, वैसा ही स्वरूप बदलना मेरे लिए समान था। बहुत अजीब।
जेएसी

5

यह मेरे लिए एक लूप के माध्यम से, zzzBov के उत्तर पर +1। यहां उस दिनांक का पूर्ण रूपांतरण है, जिसने UTC विधियों का उपयोग करके मेरे लिए काम किया:

//myMeeting.MeetingDate = '2015-01-30T00:00:00'

var myDate = new Date(myMeeting.MeetingDate);
//convert to JavaScript date format
//returns date of 'Thu Jan 29 2015 19:00:00 GMT-0500 (Eastern Standard Time)' <-- One Day Off!

myDate = new Date(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate());
//returns date of 'Fri Jan 30 2015 00:00:00 GMT-0500 (Eastern Standard Time)' <-- Correct Date!

4

इसका मतलब 2011-09-24 00:00:00 GMT , और जब से तुम पर हो GMT -4, यह 20:00पिछले दिन होगा।

व्यक्तिगत रूप से, मुझे मिलता है 2011-09-24 02:00:00, क्योंकि मैं जी रहा हूं GMT +2


3

हालांकि ओपी के मामले में टाइमज़ोन ईडीटी है, लेकिन इसकी गारंटी नहीं है कि उपयोगकर्ता आपकी स्क्रिप्ट को निष्पादित कर रहा है, वह ईडीटी टाइमज़ोन होगा, इसलिए ऑफसेट को हार्डकोड करना जरूरी नहीं होगा। मैंने जो समाधान पाया वह तारीख स्ट्रिंग को विभाजित करता है और दिनांक निर्माणकर्ता में अलग-अलग मूल्यों का उपयोग करता है।

var dateString = "2011-09-24";
var dateParts = dateString.split("-");
var date = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]);

ध्यान दें कि आपको JS अजीबता के एक और टुकड़े के लिए जिम्मेदार होना चाहिए: महीना शून्य-आधारित है।


2

मुझे इस सटीक समस्या का सामना करना पड़ा जहां मेरा ग्राहक अटलांटिक मानक समय पर था। ग्राहक द्वारा पुनर्प्राप्त की गई तारीख का मूल्य "2018-11-23" था और जब कोड ने इसे new Date("2018-11-23")ग्राहक के लिए आउटपुट में पारित किया, तो वह पिछले दिन के लिए था। मैंने एक उपयोगिता फ़ंक्शन बनाया जैसा कि स्निपेट में दिखाया गया है कि तारीख को सामान्य किया गया, जिससे ग्राहक को अपेक्षित तारीख मिली।

date.setMinutes(date.getMinutes() + date.getTimezoneOffset());

var normalizeDate = function(date) {
  date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
  return date;
};

var date = new Date("2018-11-23");

document.getElementById("default").textContent = date;
document.getElementById("normalized").textContent = normalizeDate(date);
<h2>Calling new Date("2018-11-23")</h2>
<div>
  <label><b>Default</b> : </label>
  <span id="default"></span>
</div>
<hr>
<div>
  <label><b>Normalized</b> : </label>
  <span id="normalized"></span>
</div>


2

यदि आप यह सुनिश्चित करने के लिए देख रहे हैं कि दिनांक के अलग-अलग हिस्से प्रदर्शन प्रयोजनों के लिए समान रहें, तो * यह तब काम करता प्रतीत होता है, जब मैं अपना टाइमज़ोन बदलता हूं:

var doo = new Date("2011-09-24 00:00:00")

बस वहाँ में शून्य जोड़ें।

मेरे कोड में मैं यह करता हूं:

let dateForDisplayToUser = 
  new Date( `${YYYYMMDDdateStringSeparatedByHyphensFromAPI} 00:00:00` )
  .toLocaleDateString( 
    'en-GB', 
    { day: 'numeric', month: 'short', year: 'numeric' }
  )

और मैं अपने कंप्यूटर पर अपने समयक्षेत्र के आसपास स्विच करता हूं और तारीख उसी तरह रहती है जैसे कि एपीआई से मुझे मिलने वाली yyyy-mm-dd डेट स्ट्रिंग।

लेकिन क्या मुझे कुछ याद आ रहा है / क्या यह एक बुरा विचार है?

* कम से कम क्रोम में। यह सफारी में काम नहीं करता है! इस लेखन के रूप में


जब आप करते हैं .toISOString(), तो यह 1 दिन पीछे चला जाता है।
vivek_23

new Date('2019/11/18 05:30:00').toISOString();मेरे लिए काम किया
vivek_23

1

अधिक रूपांतरण विधियों का उपयोग किए बिना इसे संभालने का सबसे अच्छा तरीका है,

 var mydate='2016,3,3';
 var utcDate = Date.parse(mydate);
 console.log(" You're getting back are 20.  20h + 4h = 24h :: "+utcDate);

अब बस अपनी तिथि में GMT जोड़ें या आप इसे संलग्न कर सकते हैं।

 var  mydateNew='2016,3,3'+ 'GMT';
 var utcDateNew = Date.parse(mydateNew);
 console.log("the right time that you want:"+utcDateNew)

लाइव: https://jsfiddle.net/gajender/2kop9vrk/1/


1

मैंने कुछ इस तरह के मुद्दे का सामना किया। लेकिन मेरा मुद्दा डेटाबेस से तारीख प्राप्त करते समय बंद सेट था।

यह डेटाबेस में है और यह UTC प्रारूप में है।

2019-03-29 19: 00: 00.0000000 +00: 00

इसलिए जब मैं डेटाबेस और चेक डेट से मिलता हूं तो इसके साथ ऑफसेट जोड़ रहा है और जावास्क्रिप्ट में वापस भेज देता हूं।

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

यह +05: 00 जोड़ रहा है क्योंकि यह मेरा सर्वर टाइमज़ोन है। मेरा ग्राहक अलग समय क्षेत्र +07: 00 पर है।

2019-03-28T19: 00: 00 + 05: 00 // यह वही है जो मुझे जावास्क्रिप्ट में मिलता है।

तो यहाँ मेरा समाधान है कि मैं इस मुद्दे के साथ क्या करूँ।

var dates = price.deliveryDate.split(/-|T|:/);
var expDate = new Date(dates[0], dates[1] - 1, dates[2], dates[3], dates[4]);
var expirationDate = new Date(expDate);

इसलिए जब तारीख सर्वर से आती है और सर्वर ऑफसेट होती है तो मैं तारीख को विभाजित करता हूं और सर्वर ऑफसेट को हटाता हूं और फिर तारीख में परिवर्तित होता है। यह मेरे मुद्दे को हल करता है।



0

आप ISO दिनांक स्ट्रिंग प्रारूप का उपयोग कर रहे हैं, जो इस पृष्ठ के अनुसार , UTC समयक्षेत्र का उपयोग कर निर्माण की तारीख का कारण बनता है:

नोट: दिनांक निर्माण (और Date.parse, वे समतुल्य हैं) के साथ तार तार के पार्सिंग को ब्राउज़र के अंतर और विसंगतियों के कारण दृढ़ता से हतोत्साहित किया जाता है। RFC 2822 प्रारूप स्ट्रिंग्स के लिए समर्थन केवल सम्मेलन द्वारा है। आईएसओ 8601 प्रारूपों के लिए समर्थन उस दिनांक-केवल स्ट्रिंग्स में भिन्न होता है (उदाहरण के लिए "1970-01-01") को यूटीसी के रूप में माना जाता है, स्थानीय नहीं।

यदि आप पाठ को अलग तरीके से प्रारूपित करते हैं, जैसे कि "Jan 01 1970", तो (कम से कम मेरी मशीन पर) यह आपके स्थानीय समयक्षेत्र का उपयोग करता है।


0

इस सूत्र में मेरे 2 सेंट जोड़ने की कोशिश कर रहा है (@ पाउल-विंट्ज़ जवाब पर विस्तार से)।

मुझे लगता है कि जब डेट कंस्ट्रक्टर को एक स्ट्रिंग मिलती है जो आईएसओ 8601 प्रारूप (दिनांक भाग) के पहले भाग से मेल खाती है, तो यह 0 समय के साथ यूटीसी समय क्षेत्र में एक सटीक तिथि रूपांतरण करता है। जब उस तिथि को स्थानीय समय में परिवर्तित किया जाता है, तो मध्यरात्रि यूटीसी स्थानीय समय क्षेत्र में पूर्व की तिथि होने पर एक तिथि परिवर्तन हो सकता है।

new Date('2020-05-07')
Wed May 06 2020 20:00:00 GMT-0400 (Eastern Daylight Time)

यदि तारीख स्ट्रिंग किसी अन्य "शिथिल" प्रारूप में है (उपयोग करता है "/" ​​या दिनांक / माह शून्य के साथ गद्देदार नहीं है) तो यह स्थानीय समय क्षेत्र में तारीख बनाता है, इस प्रकार कोई दिनांक स्थानांतरण मुद्दा नहीं है।

new Date('2020/05/07')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-5-07')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-5-7')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-05-7')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)

तो फिर एक त्वरित फिक्स, जैसा कि ऊपर उल्लेख किया गया है, आपके आईएसओ फॉर्मेटेड डेट केवल स्ट्रिंग में "-" के साथ "/" को बदलना है।

new Date('2020-05-07'.replace('-','/'))
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)

0

yyyy-mm-ddMySql दिनांक प्रारूप में संग्रहीत करना आपको निम्नलिखित कार्य करना चाहिए:

const newDate = new Date( yourDate.getTime() + Math.abs(yourDate.getTimezoneOffset()*60000) );
console.log(newDate.toJSON().slice(0, 10)); // yyyy-mm-dd

-1

आपका लॉग GMT को आउटपुट करता है ताकि आप अपना टाइमज़ोन निर्दिष्ट करना चाहें:

var doo = new Date("2011-09-24 EST");

3
इस सवाल के पहले से ही बहुत सारे जवाब हैं। यदि आप किसी भी तरह से प्रश्न का उत्तर देना चाहते हैं, तो आपको कुछ नया उल्लेख करना चाहिए जो अन्य उत्तर नहीं देते हैं। शीर्ष उत्तर पहले से ही समय क्षेत्र के साथ समस्या को अधिक विस्तार से बताता है।
केल्विन गॉडफ्रे

यह उत्तर लगभग बिल्कुल stackoverflow.com/a/7556642/8828658
एक पत्थर arachnid

कौन परवाह करता है अगर उसकी व्याख्या अधिक गहराई में है ... उसका कोड अभी भी मेरा से अलग है। मेरा बहुत सरल है। और हाँ पत्थर सही आप सही हैं। मेरी गलती।
bmacx7

-3

कोई बात नहीं, GMT -0400 पर ध्यान नहीं दिया, जो कल होने की तारीख का कारण बनता है

आप एक डिफ़ॉल्ट "समय" को 12:00:00 पर सेट करने का प्रयास कर सकते हैं


हाँ, मैं अपने जवाब के साथ थोड़ा तेज़ था, इस बारे में खेद है। मेरे उत्तर को संशोधित किया।
क्रिस

-3

निम्नलिखित ने मेरे लिए काम किया -

    var doo = new Date("2011-09-24").format("m/d/yyyy");

यह तब भी काम नहीं करेगा जब तक कि आप टाइमजोन के साथ फील नहीं करते।
गर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.