आप UTC में जावास्क्रिप्ट तिथि कैसे परिवर्तित करते हैं?


590

मान लीजिए कि आपकी वेबसाइट का एक उपयोगकर्ता एक तिथि सीमा में प्रवेश करता है।

2009-1-1 to 2009-1-3

आपको कुछ प्रोसेसिंग के लिए इस तिथि को सर्वर पर भेजने की आवश्यकता है, लेकिन सर्वर को उम्मीद है कि सभी तिथियां और समय यूटीसी में होंगे।

अब मान लें कि उपयोगकर्ता अलास्का या हवाई या फिजी में है। चूंकि वे UTC से काफी अलग समयक्षेत्र में हैं, इसलिए तिथि सीमा को कुछ इस तरह परिवर्तित किया जाना चाहिए:

2009-1-1T8:00:00 to 2009-1-4T7:59:59

जावास्क्रिप्ट तिथि ऑब्जेक्ट का उपयोग करते हुए, आप सर्वर को समझने वाली किसी चीज़ में पहली "स्थानीयकृत" तिथि सीमा को कैसे परिवर्तित करेंगे?


10
इसे पुनर्जीवित किया क्योंकि यह मेरे लिए शीर्ष Google हिट था, और नए ब्राउज़रों ने यूटीसी तिथि के तार के लिए अंतर्निहित समर्थन किया है।
jcomeau_ictx

4
मैंने नए ECMAscript 5 toISOString () पद्धति को उजागर करने के लिए स्वीकृत उत्तर को अपडेट किया। देखें stackoverflow.com/a/11957822/19112
dthrasher

5
इसलिए 2015 में मुझे तारीखों को सख्त और पार्स करने के साथ गड़बड़ करना है? हास्यास्पद!
टूलकिट

2
बेशक आपके पास है। आप कभी भी आपके लिए काम करने वाले किसी और पर भरोसा नहीं कर सकते हैं: -पी कम से कम जब तक दुनिया टाइमज़ोन का उपयोग करना बंद कर देती है और तारीखों और समय को अनफिल करना शुरू कर देती है।
एरेनोर पाज़

4
"स्टारडेट्स", अधिमानतः।
माइकल डॉव

जवाबों:


370

toISOString()विधि को सरल बनाया विस्तारित आईएसओ प्रारूप (में एक स्ट्रिंग रिटर्न आईएसओ 8601 ) है, जो हमेशा 24 या 27 वर्ण लंबा (है YYYY-MM-DDTHH:mm:ss.sssZया ±YYYYYY-MM-DDTHH:mm:ss.sssZ, क्रमशः)। समयावधि हमेशा शून्य यूटीसी ऑफसेट होती है, जैसा कि प्रत्यय " Z" द्वारा दर्शाया गया है ।

स्रोत: एमडीएन वेब डॉक्स

आपके द्वारा आवश्यक प्रारूप .toISOString()विधि के साथ बनाया गया है। पुराने ब्राउज़र (यानी 8 और उससे कम) के लिए, जो इस पद्धति का मूल समर्थन नहीं करते हैं, शिम यहां पाया जा सकता है :

यह आपको वह करने की क्षमता देगा जो आपको चाहिए:

var isoDate = new Date('yourdatehere').toISOString();

Timezone के काम के लिए, moment.js और moment.js timezone वास्तव में अमूल्य उपकरण हैं ... विशेष रूप से क्लाइंट और सर्वर जावास्क्रिप्ट के बीच टाइमज़ोन नेविगेट करने के लिए।


81
वास्तव में यह डेट ऑब्जेक्ट को स्ट्रिंग में परिवर्तित करता है, इस पर आगे की तारीख के ऑपरेशन नहीं कर पाएंगे
orszaczky

2
@ TheRebel, दिया गया उपयोग-मामला यह है कि उसे सर्वर को एक स्वरूपित स्ट्रिंग भेजने की आवश्यकता है।
विल स्टर्न

28
@Will, आप पूरी तरह से सही हैं, लेकिन - जैसा कि यहां के अधिकांश दर्शक मुझे मानते हैं - मैं शीर्षक के आधार पर यहां पहुंचा, सामान्य जेएस तिथि से लेकर यूटीसी रूपांतरण तक की खोज की, इसलिए मुझे लगा कि यहां इसका उल्लेख करना उपयोगी है :)
orszaczky

4
इस विधि का उपयोग करते समय सावधान रहें! यह UTC दिनांक नहीं बनाता है - यह मौजूदा दिनांक डेटा को स्वरूपित करता है जैसा कि UTC प्रारूप में है और इसे "Z" टाइमज़ोन देता है। यह समय का 99% गलत है! इस विधि का उपयोग करने से पहले आपको जीएमटी समय क्षेत्र में तारीख को परिवर्तित करना होगा!
user1944491

5
@ user1944491 मुझे नहीं लगता कि यह सही है। एमडीएन डॉक्स के अनुसार, toISOStringठीक से यूटीसी में परिवर्तित हो [toISOString] returns a string in simplified extended ISO format ... The timezone is always zero UTC offsetजाता है। उदाहरण में, वे दिखाते हैं कि ऑफसेट को तब देखा जाता है जब आईओएसओएसट्रिंग कहा जाता है
एफएफएफ

560

सरल और बेवकूफ

var date = new Date(); 
var now_utc =  Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),
 date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());

 return new Date(now_utc);

85
मुझे आपका विचार पसंद आया और मैंने एक विधि का उपयोग किया जो मैंने कई बार किया है। function convertDateToUTC(date) { return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds()); }
टिम

21
सबसे छोटा कोड मैं UTC तारीख और समय प्राप्त करने के लिए आया था, जो समय क्षेत्र से new Date(new Date().toUTCString().substr(0, 25))
हटकर है

17
ध्यान दें कि getUTCMonth () 0 से 11. मान लौटाता है। इसलिए यदि आपको स्ट्रिंग के बजाय महीने की संख्या की आवश्यकता है, तो यह मान को +1 करने में मदद करता है।
तालवी वटिया

19
यह बकवास है। नई तिथि में वास्तव में आप चाहते हैं की तुलना में एक अलग मूल्य होगा। now.toUTCSTring()(गलत) के बजाय बस का उपयोग करें now_utc.toString()
बरगी

22
मैं इसका उपयोग नहीं करूंगा - नई तिथि () का उपयोग करके आपको ब्रोयर्स टाइमज़ोन मिलेगा। Chrome 29 और IE10 में, दिनांक + समय सही प्रतीत होता है, लेकिन टाइमज़ोन ब्राउज़र के टाइमज़ोन पर सेट है, जो समस्याएँ पैदा कर सकता है ...
शॉन

207

यहाँ मेरी विधि है:

var now = new Date();
var utc = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

परिणामी utcवस्तु वास्तव में एक यूटीसी तिथि नहीं है, लेकिन एक स्थानीय तिथि यूटीसी समय (टिप्पणियों को देखें) से मेल खाने के लिए स्थानांतरित हो गई। हालांकि, व्यवहार में यह काम करता है।


मैं उस समस्या को देख रहा था जब मैंने महसूस किया कि Date.now()स्थानीय समय देता है और यूटीसी समय नहीं है, और यह समाधान मुझे सबसे सरल लगता है। कम से कम मेरे मामले में जहां मैं UNIX समय चाहता हूं और एक अच्छी तरह से स्वरूपित स्ट्रिंग नहीं। (केवल अंतर यह था कि मैं 60 * 1000केवल अतिरिक्त स्पष्ट होने के लिए गुणा करूँगा :))
टिमोथी बाउचर

18
60000 * Date.getTimezoneOffset () जोड़ना गलत है! सबसे पहले, आपको सभी तिथियों / समय के बारे में सोचना चाहिए क्योंकि प्रदर्शन उद्देश्यों के लिए टाइमजोन संशोधक के साथ पहले से ही यूटीसी है। हालाँकि, ब्राउज़र भिन्न हो सकते हैं, Date.getTime () 1970-01-01 से मिलीसेकंड की संख्या लौटाता है। यदि आप इस संख्या का उपयोग करके एक नई तिथि बनाते हैं, तो पूर्व: नई तिथि (Date.getTime ()); यह UTC होगा , हालाँकि जब आप इसे प्रदर्शित करते हैं (उदा: क्रोम देव टूल्स कंसोल के माध्यम से) तो यह आपके स्थानीय समयक्षेत्र के रूप में दिखाई देगा।
हारून हॉफमैन

15
मेरे ब्राउज़र में, यह एक डेटटाइम बनाता है जो UTC नहीं है। हालाँकि जब मेरे ब्राउज़र में प्रदर्शित किया जाता है, तो यह मेरे स्थानीय समयक्षेत्र में एक डेटटाइम प्रदर्शित करता है जो कि यूटीसी समय सही होगा यदि टाइमज़ोन जानकारी को अनदेखा कर दिया जाए।
हारून हॉफमैन

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

4
यह उत्तर "एपोच शिफ्टिंग" के एक और सामान्य कार्यान्वयन को प्रदर्शित करता है जो अलगाव में खतरनाक है, क्योंकि यह डीटीएच बदलावों जैसे किनारे के मामलों में विफल हो सकता है। सिफारिश नहीं की गई।
मैट जॉनसन-पिंट

25
Date.prototype.toUTCArray= function(){
    var D= this;
    return [D.getUTCFullYear(), D.getUTCMonth(), D.getUTCDate(), D.getUTCHours(),
    D.getUTCMinutes(), D.getUTCSeconds()];
}

Date.prototype.toISO= function(){
    var tem, A= this.toUTCArray(), i= 0;
    A[1]+= 1;
    while(i++<7){
        tem= A[i];
        if(tem<10) A[i]= '0'+tem;
    }
    return A.splice(0, 3).join('-')+'T'+A.join(':');    
}

यह अच्छा काम करता है। मुझे जावास्क्रिप्ट तिथि बनाने के लिए अपनी स्रोत तिथियों में "-" को बदलने की आवश्यकता है, तब मैं सही आउटपुट प्राप्त करने के लिए आपके टोसाओ () फ़ंक्शन को कॉल कर सकता था।
दशरथ

यह बहुत अच्छा काम करता है। आप परिणाम को jQuery $ .parseDate (...) में भी फीड कर सकते हैं ताकि UTC पर स्थानांतरित की गई दिनांक ऑब्जेक्ट वापस मिल सके।
ब्रायन एलिस

23

दिनांक / समय बदले बिना आईएसओ में परिवर्तित करें

var now = new Date(); // Fri Feb 20 2015 19:29:31 GMT+0530 (India Standard Time) 
var isoDate = new Date(now.getTime() - now.getTimezoneOffset() * 60000).toISOString();
//OUTPUT : 2015-02-20T19:29:31.238Z

दिनांक / समय में परिवर्तन के साथ आईएसओ में बदलें (तारीख / समय बदल जाएगा)

isoDate = new Date(now).toISOString();
//OUTPUT : 2015-02-20T13:59:31.238Z 

फिडल लिंक


तो यह एक तरह से FTC UTC है? मैं अपनी स्थानीय तारीख को स्थानांतरित करता हूं और मैं सर्वर को उस तारीख और समय के लिए प्रस्तुत करने में सफल होता हूं जो मैं वास्तव में अपने पीसी घड़ी पर देखता हूं। वाह। वैसे भी तारबंदी और पार्सिंग से बेहतर है
टूलकिट

इसके अलावा आपको .toISOString () की आवश्यकता नहीं है, आप बस सर्वर पर आइसोडेट भेज सकते हैं
टूलकिट

.toISOString () सरल और सीधा है, इससे निकलने की तारीख एक अतिरिक्त चरण होगा (isoDate एक फ़ंक्शन नहीं है)।
रोलरकोस्टा

क्या आपको इसे घटाने के बजाय ऑफसेट जोड़ने की आवश्यकता नहीं है? का संदर्भ लें stackoverflow.com/a/11964609/832230
अकुमेनस

@ABB यदि वर्तमान टाइमज़ोन ऑफसेट + ve है तो हमें इसे घटाना चाहिए (हमारे मामले में IST +5: 30 है) अन्यथा जोड़ें।
रोलरकोस्टा

18

ब्राउज़रों में अंतर हो सकता है, और आपको ग्राहक द्वारा उत्पन्न किसी भी जानकारी पर भरोसा न करने के लिए भी याद रखना चाहिए, ऐसा कहा जा रहा है, नीचे दिया गया कथन मेरे लिए काम करता है (Mac OS X 10.8.2 पर Google Chrome v24)

var utcDate = new Date(new Date().getTime());


संपादित करें: "यह सिर्फ कैसे अलग है new Date()?" यहाँ देखें: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

  • यदि कोई तर्क प्रदान नहीं किया जाता है, तो निर्माता सिस्टम सेटिंग्स के अनुसार वर्तमान तिथि और समय के लिए एक जावास्क्रिप्ट दिनांक ऑब्जेक्ट बनाता है।
  • नोट: जहाँ दिनांक को एक से अधिक तर्क वाले निर्माता के रूप में कहा जाता है, निर्दिष्ट तर्क स्थानीय समय का प्रतिनिधित्व करते हैं। यदि UTC वांछित है, तो एक ही तर्कों के साथ नई तिथि ( Date.UTC (...) ) का उपयोग करें । (नोट: Date.UTC () 1970-01-01 से 00is:00 UTC के बाद मिलीसेकंड की संख्या लौटाता है)

60000 * Date.getTimezoneOffset () जोड़ना जैसा कि पिछले उत्तरों में बताया गया है, गलत है। सबसे पहले, आपको सभी तिथियों / समय के बारे में सोचना चाहिए क्योंकि प्रदर्शन उद्देश्यों के लिए टाइमजोन संशोधक के साथ पहले से ही यूटीसी है।

फिर से, ब्राउज़र भिन्न हो सकते हैं, हालाँकि, Date.getTime () 1970-01-01 UTC / GMT से मिलीसेकंड की संख्या लौटाता है। यदि आप इस नंबर का उपयोग करके एक नई तिथि बनाते हैं जैसा कि मैं ऊपर करता हूं, तो यह यूटीसी / जीएमटी होगा। हालाँकि, यदि आप इसे .toString () कॉल करके प्रदर्शित करते हैं, तो यह आपके स्थानीय समय क्षेत्र में दिखाई देगा क्योंकि .toString () आपके स्थानीय समय-क्षेत्र का उपयोग करता है, न कि दिनांक ऑब्जेक्ट के टाइमज़ोन पर जिसे इसे कहा जाता है।

मैंने यह भी पाया है कि यदि आप डेट पर .getTimezoneOffset () को कॉल करते हैं, तो यह आपके स्थानीय समयक्षेत्र को लौटाएगा, न कि उस दिनांक ऑब्जेक्ट के टाइमज़ोन पर जिसे आपने इसे कॉल किया था (मैं इसे मानक होने के बावजूद सत्यापित नहीं कर सकता)।

मेरे ब्राउज़र में, 60000 * Date.getTimezoneOffset () जोड़कर एक डेटटाइम बनाता है जो UTC नहीं है । हालाँकि जब मेरे ब्राउज़र में प्रदर्शित किया जाता है (उदाहरण: .toString ()), तो यह मेरे स्थानीय समयक्षेत्र में एक दिनांक समय प्रदर्शित करता है, जो कि समय की जानकारी को नजरअंदाज करने पर UTC के समय के लिए सही होगा।


11
मैं सिर्फ एफएक्स और क्रोम पर इस कोड को चलाता था, यह काम नहीं करता है: परिणाम बिल्कुल उसी तरह से है new Date(), न तो टाइमस्टैम्प और न ही टाइमज़ोन को बदला गया है
ग्रास डबल

3
ऐसा इसलिए है क्योंकि टाइमस्टैम्प टाइम-लेस हैं। new Date().getTime()हमेशा एक टाइमस्टैम्प लौटाएगा जो टाइमज़ोन के लिए अज्ञेय है। जब तक आप यूनिक्स की अवधि के बाद मिलीसेकंड की संख्या के अलावा किसी और चीज में इसे प्रारूपित करने की कोशिश करते हैं, तब तक इससे जुड़ा कोई टाइमस्टैम्प नहीं है।
frontendbeauty

7
जहाँ तक मैं new Date(new Date().getTime())रिटर्न बता सकता हूँ के रूप में बिल्कुल वैसा ही मूल्य new Date()। क्या आप बता सकते हैं कि आपका उत्तर किस मायने में एक अलग मूल्य प्रदान करता है new Date()?
कर्क वॉक

मैं इस मूल्य को अपने सर्वर पर पोस्ट कर रहा हूं new Date("5/19/2014").getTime()। दिनांक निर्माता ने +7 ऑफसेट के साथ एक तारीख बनाई। सर्वर (C #) पर, मैं पोस्ट किए गए मान को मिलीसेकंड के रूप में यूनिक्स युग में जोड़ता हूं new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(1401087600000)। परिणाम है 5/19/2014 7:00:00 AM। तो यह getTime लगता है () मेरे UTC ऑफसेट सहित मिलीसेकंड की संख्या देता है।
xr280xr

1
बहुत सारी टिप्पणियां शिकायत करती हैं जो new Date(new Date().getTime())काम नहीं करती हैं। मैं पुष्टि कर सकता हूं कि new Date(Date.UTC(2019, 8, 27, 0, 0, 0))वास्तव में UTC समय का उत्पादन करता है। यदि आप उपयोग करने में विफल रहते हैं तो आपको Date.UTC(...)अपने समयक्षेत्र में यूटीसी ऑफसेट में तारीखें मिलेंगी
एलेक्स बार्कर

15
var myDate = new Date(); // Set this to your date in whichever timezone.
var utcDate = myDate.toUTCString();

1
दिनांक ऑब्जेक्ट को वास्तव में किसी दिनांक पर सेट करने की आवश्यकता है। ऊपर सिर्फ एक उदाहरण है।
जेम्स स्किडमोर

5
अब यह "गुरु, 04 जून 2009 04:10:56 GMT" लौटाता है, जो ओपी में आवश्यक आईएसओ प्रारूप नहीं है।
निक

4
यह इसे एक स्ट्रिंग में बदल देता है, जो कि तारीख नहीं है
एंथनी

2
नहीं, वास्तव में यह ओपी के अनुसार एक तारीख का एक स्ट्रिंग प्रतिनिधित्व होना चाहिए।
jcomeau_ictx

3
UTC में परिवर्तित करने के बाद, यह स्ट्रिंग प्रारूप में वापस आ रहा है, फिर getMonth (), getDate () आदि जैसे तरीकों तक कैसे पहुँचें
संदीप रेतीले

10

UTC में परिवर्तित करने के लिए एक अन्य समाधान और इसे दिनांक ऑब्जेक्ट के रूप में रखें: (यह स्वरूपित स्ट्रिंग के अंत से 'GMT' भाग को हटाकर काम करता है, फिर इसे वापस दिनांक निर्माणकर्ता में डाल देता है)

var now = new Date();
var now_utc = new Date(now.toUTCString().slice(0, -4));

मुझे एक डेटाइम पिकर लाइब्रेरी के साथ इंटरफेस करने के लिए ऐसा करने की आवश्यकता थी। लेकिन सामान्य तौर पर इस तरह से तारीखों के साथ काम करना एक बुरा विचार है।

उपयोगकर्ता आमतौर पर अपने स्थानीय समय में डेटाटाइम के साथ काम करना चाहते हैं, इसलिए आप या तो सर्वर साइड कोड को ऑफ़सेट के साथ डेटाइम स्ट्रिंग्स को पार्स करने के लिए अपडेट करते हैं, फिर UTC (सर्वश्रेष्ठ विकल्प) में कनवर्ट करते हैं या आप भेजने से पहले UTC स्ट्रिंग क्लाइंट-साइड में कनवर्ट करते हैं सर्वर (विल स्टर्न के उत्तर की तरह)


7

क्या आप तारीख को स्ट्रिंग में बदलने की कोशिश कर रहे हैं?

मैं ऐसा करने के लिए एक फ़ंक्शन बनाऊंगा, और, हालांकि यह थोड़ा विवादास्पद है, इसे तिथि प्रोटोटाइप में जोड़ें। यदि आप ऐसा करने में सहज नहीं हैं, तो आप इसे एक स्टैंडअलोन फ़ंक्शन के रूप में डाल सकते हैं, एक पैरामीटर के रूप में तारीख को पारित कर सकते हैं।

Date.prototype.getISOString = function() {
    var zone = '', temp = -this.getTimezoneOffset() / 60 * 100;
    if (temp >= 0) zone += "+";
    zone += (Math.abs(temp) < 100 ? "00" : (Math.abs(temp) < 1000 ? "0" : "")) + temp;

    // "2009-6-4T14:7:32+10:00"
    return this.getFullYear()   // 2009
         + "-"
         + (this.getMonth() + 1) // 6
         + "-"
         + this.getDate()       // 4
         + "T"
         + this.getHours()      // 14
         + ":"
         + this.getMinutes()    // 7
         + ":"
         + this.getSeconds()    // 32
         + zone.substr(0, 3)    // +10
         + ":"
         + String(temp).substr(-2) // 00
    ;
};

यदि आपको UTC समय में इसकी आवश्यकता है, तो बस get *C के साथ सभी get * फ़ंक्शन को बदलें, जैसे: getUTCFullYear, getUTCMonth, getUTCHours ... और फिर उपयोगकर्ता के टाइमज़ोन ऑफ़सेट के बजाय अंत में "+00: 00" जोड़ें।


1
यह पहला उदाहरण है जो मैंने देखा है कि टाइमज़ोन ऑफसेट को संभालने का प्रयास करता है, इसलिए उसके लिए +1। हालाँकि, मुझे इसके साथ कुछ चीजें मिलीं - temp.substr (-2) एक त्रुटि का कारण बनता है क्योंकि यह एक संख्या है, न कि एक स्ट्रिंग, इसलिए आपको "temp = '' + temp; सबसे पहले, इसे एक स्ट्रिंग में बदलने के लिए। इसके अलावा, मैं अपनी आईएसओ तिथियों को शून्य-गद्देदार पसंद करता हूं - मुझे लगता है कि यह उन्हें और अधिक मानक बनाता है।
मिक सियर

@ विक - मैंने उस बग को ठीक करने के लिए अपडेट किया है। मैंने इन दिनों JSLint त्रुटि के रूप में रिपोर्ट की गई है String(temp)(दूसरे तरीके से "" + temp) का उपयोग किया है ।
nickf


7
date = '2012-07-28'; stringdate = new Date(date).toISOString();

सबसे नए ब्राउज़रों में काम करना चाहिए। यह 2012-07-28T00:00:00.000Zफ़ायरफ़ॉक्स 6.0 पर लौटता है


7

तारीखों के साथ काम करते समय मेरी सिफारिश उपयोगकर्ता इनपुट से व्यक्तिगत क्षेत्रों में तारीख को पार्स करने की है। आप इसे एक पूर्ण स्ट्रिंग के रूप में उपयोग कर सकते हैं, लेकिन आप आग से खेल रहे हैं।

जावास्क्रिप्ट अलग-अलग स्वरूपों में दो समान तिथियों का इलाज कर सकता है।

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

ऐसा कुछ भी कभी न करें:

new Date('date as text');

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

var year = getFullYear('date as text');
var month = getMonth('date as text');
var dayOfMonth = getDate('date as text');

var date = new Date(year, month, dayOfMonth);

var offsetInMs = ((date.getTimezoneOffset() * 60)  // Seconds
                 * 1000);                          //  Milliseconds

var utcDate = new Date(date.getTime + offsetInMs);

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


FYI GetYear को वेब मानकों से हटाया जा रहा है। developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Ghan

6

यदि आप तारीखों के साथ काम कर रहे हैं, तो यह क्षण का उपयोग करने लायक है । js ( http://momentjs.com )। यूटीसी में बदलने की विधि इस प्रकार होगी:

moment(yourTime).utc()

आप अपनी तिथि को किसी भी स्वरूप में बदलने के लिए प्रारूप का उपयोग कर सकते हैं:

moment(yourTime).utc().format("YYYY-MM-DD")

समय के साथ-साथ ऑफसेट विकल्प भी हैं लेकिन टाइमज़ोन ( http://momentjs.com/timezone )? से निपटने के लिए एक अतिरिक्त पूरक पुस्तकालय है । समय रूपांतरण इस तरह सरल होगा:

moment.tz(yourUTCTime, "America/New_York")

क्या बीच का अंतर है moment(yourTime).utc()और moment.utc(yourTime)? मैं आमतौर पर बाद का उपयोग करता हूं।
ps0604

5

मेरा समाधान तारीख को वही रखता है जो क्लाइंट-साइड पर टाइमजोन सेट करने के लिए नहीं है। शायद किसी को यह उपयोगी लगेगा।

मेरा उपयोग मामला:

मैं एक टूडू ऐप बना रहा हूं, जहां आप अपने कार्य की तिथि निर्धारित करते हैं। यह तारीख स्थिर रहनी चाहिए चाहे आप किसी भी समय में हो।

उदाहरण। आप 25 जून को सुबह 8 बजे अपने दोस्त को फोन करना चाहते हैं।

जब आप चीन में हों, तो आप इस कार्य को ५ दिन (२० जून) से पहले करें।

फिर, उसी दिन, आप कुछ दिनों के लिए न्यूयॉर्क जाते हैं।

फिर 25 जून को, जब आप अभी भी न्यूयॉर्क में हैं, तो आप सुबह 7:30 बजे उठते हैं (जिसका अर्थ है कि आपको 30 मिनट में कार्य सूचना प्राप्त करनी चाहिए (यहां तक ​​कि यह 1:30 बजे चीन में पहले से ही है जहां आप बनाते समय थे) कार्य)

इसलिए कार्य समयक्षेत्र की अनदेखी कर रहा है। इसका मतलब है 'मैं इसे सुबह 8 बजे करना चाहता हूं जो भी समयक्षेत्र मैं होगा'।

मैं जो करता हूं वह कहता हूं 'मुझे लगता है कि आप हमेशा लंदन टाइमजोन - यूटीसी में हैं।'

इसका क्या अर्थ है - जब उपयोगकर्ता अपने / अपने Timezone में कुछ तारीख चुनता है - मैं इस तिथि को UTC में उसी तिथि में परिवर्तित करता हूँ। अर्थात। आप चीन में सुबह 8 बजे जाते हैं, लेकिन मैं इसे 8 बजे यूटीसी में परिवर्तित करता हूं।

फिर - अगली बार जब आप ऐप खोलते हैं - मैं UTC में सहेजे गए दिनांक को पढ़ता हूं और इसे आपके वर्तमान समयक्षेत्र में उसी दिनांक में परिवर्तित करता हूं - जैसे। मैं UTC में सुबह 8 बजे से न्यूयॉर्क के समयक्षेत्र में 8 बजे तक परिवर्तित हो जाता हूं।

इस समाधान का मतलब है कि यह तारीख कुछ और हो सकती है, यह इस बात पर निर्भर करता है कि आप इसे सेट करते समय कहां हैं और आप इसे पढ़ रहे हैं, लेकिन यह इस तरह से स्थिर रहता है कि यह आपको ऐसा लगता है जैसे आप हमेशा एक ही समयक्षेत्र में हैं।

आइए कुछ कोड लिखें:

पहला - समयसीमा की अनदेखी / यूटीसी से / यूटीसी में परिवर्तित करने के हमारे 2 मुख्य कार्य हैं:

export function convertLocalDateToUTCIgnoringTimezone(date: Date) {
  const timestamp = Date.UTC(
    date.getFullYear(),
    date.getMonth(),
    date.getDate(),
    date.getHours(),
    date.getMinutes(),
    date.getSeconds(),
    date.getMilliseconds(),
  );

  return new Date(timestamp);
}

export function convertUTCToLocalDateIgnoringTimezone(utcDate: Date) {
  return new Date(
    utcDate.getUTCFullYear(),
    utcDate.getUTCMonth(),
    utcDate.getUTCDate(),
    utcDate.getUTCHours(),
    utcDate.getUTCMinutes(),
    utcDate.getUTCSeconds(),
    utcDate.getUTCMilliseconds(),
  );
}

फिर, मैं इस तिथि को सहेजता / पढ़ता हूं:

function saveTaskDate(localDate: Date) {
  // I convert your local calendar date so it looks like you've picked it being in UTC somewhere around London
  const utcDate = convertLocalDateToUTCIgnoringTimezone(localDate);
  api.saveTaskDate(utcDate);
}

function readTaskDate(taskUtcDate: Date) {
  // I convert this UTC date to 'look in your local timezone' as if you were now in UTC somewhere around london
  const localDateWithSameDayAsUTC = convertUTCToLocalDateIgnoringTimezone(taskUtcDate);

  // this date will have the same calendar day as the one you've picked previously
  // no matter where you were saving it and where you are now
}

4

मुझे अभी पता चला है कि स्टीवन लेविथान की तारीख का 1.2.3 संस्करण ।format.js वही करता है जो मैं चाहता हूं। यह आपको जावास्क्रिप्ट तिथि के लिए एक प्रारूप स्ट्रिंग की आपूर्ति करने की अनुमति देता है और स्थानीय समय से यूटीसी में परिवर्तित हो जाएगा। अब मैं जिस कोड का उपयोग कर रहा हूं:

// JavaScript dates don't like hyphens!    
var rectifiedDateText = dateText.replace(/-/g, "/");
var d = new Date(rectifiedDateText);

// Using a predefined mask from date.format.js.
var convertedDate = dateFormat(d, 'isoUtcDateTime'); 

9
यह आपके प्रश्न का सबसे अच्छा उत्तर नहीं लगता है। आपको किसी ऐसी चीज़ पर पुनर्विचार करना चाहिए जो सीधे आपके सवाल का जवाब दे या आपके सवाल को अलग तरीके से पूछे।
१४:४४

1
मैं इस सटीक स्क्रिप्ट (और संस्करण) को फिक्स करने वाला हूं क्योंकि यह IE7 और फ़ायरफ़ॉक्स के लिए अपर्याप्त है।
बारबारोसा

4

मैंने jQuery ग्लोबलाइजेशन प्लगइन की तारीख को सर्वश्रेष्ठ करने के लिए पार्सिंग पाया है । अन्य विधियों में क्रॉस-ब्राउज़र समस्याएँ थीं और तारीख की तरह सामान.जेएस को काफी समय में अपडेट नहीं किया गया था।

आपको पृष्ठ पर किसी तारीख की आवश्यकता नहीं है। आप डॉक्स में दिए गए उदाहरण के समान कुछ कह सकते हैं:

$.parseDate('yy-mm-dd', '2007-01-26');

1
सिर्फ इसलिए कि कुछ अद्यतन नहीं किया गया है, इसका मतलब यह नहीं है कि आपको इसका उपयोग नहीं करना चाहिए। Date.js ने वर्षों तक पूरी तरह से काम किया है, इसलिए इसे अपडेट करने की आवश्यकता नहीं है। JS दिनांक ऑब्जेक्ट और उपयोग में दिनांक स्वरूप पिछले कुछ वर्षों में परिवर्तित नहीं हुए हैं, इसलिए उन्हें स्क्रिप्ट में हेरफेर क्यों किया जाएगा? Date.JS वहाँ से बाहर सबसे अच्छा जेएस दिनांक पुस्तकालय है। गिथब में इसके लिए कुछ मुद्दे हैं, लेकिन अन्यथा, यह एकदम सही है। github.com/datejs/Datejs
Thugsb

3

यह फंक्शन मेरे लिए खूबसूरती से काम करता है।

function ParseDateForSave(dateValue) {
    // create a new date object
    var newDate = new Date(parseInt(dateValue.substr(6)));

    // return the UTC version of the date
    return newDate.toISOString();
}


2
var userdate = new Date("2009-1-1T8:00:00Z");
var timezone = userdate.getTimezoneOffset();
var serverdate = new Date(userdate.setMinutes(userdate.getMinutes()+parseInt(timezone)));

यह आपको उचित यूटीसी दिनांक और समय देगा।
ऐसा इसलिए है क्योंकि getTimezoneOffset()वसीयत आपको मिनटों में समय क्षेत्र में अंतर देगी। मैं आपको सलाह देता हूं कि इसका उपयोग न करें toISOString()क्योंकि आउटपुट स्ट्रिंग में होगा इसलिए भविष्य में आप तारीख में हेरफेर नहीं कर पाएंगे



2

अगर आपको Date Object चाहिए

केवल दिनांक स्ट्रिंग पास करना समय मान लेता है 00:00 समय क्षेत्र द्वारा स्थानांतरित किया गया:

new Date('2019-03-11')
Sun Mar 10 2019 18:00:00 GMT-0600 (Central Standard Time)

यदि आप वर्तमान समय और मिनट जोड़ते हैं, तो आपको उचित तिथि मिलती है:

new Date('2019-03-11 ' + new Date().getHours() + ':' + new Date().getMinutes())
Mon Mar 11 2019 04:36:00 GMT-0600 (Central Standard Time)

1

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

मैं मान रहा हूं कि आप मानक डेटा दिशानिर्देशों के अनुरूप हैं जो किसी विशेष प्रारूप में डेटा की अपेक्षा करते हैं। उदाहरण के लिए, मैं ODATA का उपयोग करता हूं जो एक RESTfull API है जो प्रारूप में दिनांक समय ऑब्जेक्ट्स की अपेक्षा करता है: -

YYYY-MM-DDT00: 00: 00।

नीचे पोस्ट किए गए स्निपेट के माध्यम से आसानी से प्राप्त किया जा सकता है (कृपया अपनी आवश्यकता के अनुसार प्रारूप बदलें)।

var mydate;//assuming this is my date object which I want to expose var UTCDateStr = mydate.getUTCFullYear() + "-" + mydate.getUTCMonth() + "-" + mydate.getUTCDate() + "T00:00:00";

यदि दूसरी ओर, आप मेरी स्थिति में हैं, जिसमें आपको अपने बैकएंड से एक तारीख मिली है, और ब्राउज़र इसे आपकी स्थानीय तारीख में परिवर्तित करता है। दूसरी ओर आप UTC तिथि में रुचि रखते हैं तो आप निम्नलिखित कार्य कर सकते हैं: -

var mydate;//assuming this is my date object which I want to expose var UTCDate = new Date(mydate);/*create a copy of your date object. Only needed if you for some reason need the original local date*/ UTCDate.setTime(UTCDate.getTime() + UTCDate.getTimezoneOffset() * 60 * 1000);

मूल रूप से ऊपर कोड स्निपेट टाइमजोन के आधार पर ब्राउज़र द्वारा जोड़े गए / घटाए गए समय को जोड़ता / घटाता है।

उदाहरण के लिए यदि मैं ईएसटी (जीएमटी -5) में हूं और मेरी सेवा दिनांक समय वस्तु = दिनांक 17 अगस्त 2016 को 00:00:00 जीएमटी -0500 मेरा ब्राउज़र स्वचालित रूप से अपना स्थानीय समय प्राप्त करने के लिए टाइमजोन ऑफसेट (5hrs) को घटाता है। इसलिए अगर मैं समय प्राप्त करने की कोशिश करता हूं तो मुझे बुध अगस्त 16 2016 19:00:00 GMT-0500 मिलता है। इसके कारण बहुत सारी समस्याएं होती हैं। वहाँ बहुत सारे पुस्तकालय हैं जो निश्चित रूप से यह आसान बना देंगे लेकिन मैं शुद्ध जेएस दृष्टिकोण को साझा करना चाहता था।

अधिक जानकारी के लिए कृपया यहां देखें: http://praveenlobo.com/blog/how-to-convert-javascript-local-date-to-utc-and-utc-to-local-date/ जहां मुझे मेरी प्रेरणा स्त्रोत।

उम्मीद है की यह मदद करेगा!


1

यह विधि आपको देगी: 2017-08-04T11:15:00.000+04:30और आप बस प्राप्त करने के लिए ज़ोन चर को अनदेखा कर सकते हैं 2017-08-04T11:15:00.000

function getLocalIsoDateTime(dtString) {
    if(dtString == "")
        return "";
    var offset = new Date().getTimezoneOffset();
    var localISOTime = (new Date(new Date(dtString) - offset * 60000 /*offset in milliseconds*/)).toISOString().slice(0,-1);
    //Next two lines can be removed if zone isn't needed.
    var absO = Math.abs(offset);
    var zone = (offset < 0 ? "+" : "-") + ("00" + Math.floor(absO / 60)).slice(-2) + ":" + ("00" + (absO % 60)).slice(-2);
    return localISOTime + zone;
}

1

क्षण पैकेज का उपयोग करके, आप आसानी से UTC की दिनांक स्ट्रिंग को नई दिनांक ऑब्जेक्ट में बदल सकते हैं:

const moment = require('moment');
let b = new Date(moment.utc('2014-02-20 00:00:00.000000'));
let utc = b.toUTCString();
b.getTime();

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


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


0

मुझे पता है कि यह प्रश्न पुराना है, लेकिन इसी मुद्दे को देख रहा था, और एक विकल्प इसके बजाय date.valueOf () को सर्वर पर भेजना होगा। जावास्क्रिप्ट दिनांक का मान () फ़ंक्शन 1 जनवरी, 1970 UTC की आधी रात के बाद से मिलीसेकंड की संख्या भेजता है।

का मूल्य()


0

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

//First i had a string called stringDateVar that i needed to convert to Date
var newDate = new Date(stringDateVar)

//output: 2019-01-07T04:00:00.000Z
//I needed it 2019-01-07T00:00:00.000Z because i had other logic that was dependent on that 

var correctDate = new Date(newDate.setUTCHours(0))

//This will output 2019-01-07T00:00:00.000Z on everything which allows scalability 

0

यार्न जोड़ें पल

import moment from 'moment';

//local Js date to UTC using moment
const utcDate = moment.utc(moment(new date()).format('YYYY-MM-DDTHH:mm:ss')).valueOf();
console.log('UTC Date', utcDate);


// UTC to local date without moment
const localDate = convertUTCDateToLocalDate(new Date(utcDate))
console.log('UTC Date', moment(localDate).format('MMM D, YYYY HH:mm'));


function convertUTCDateToLocalDate(date) {

   let newDate = new Date(date.getTime() + date.getTimezoneOffset()*60*1000);

   const offset = date.getTimezoneOffset() / 60;
   const hours = date.getHours();

   newDate.setHours(hours - offset);

   return newDate;

}


-8

और भी सरल

myvar.setTime(myvar.getTime() + myvar.getTimezoneOffset() * 60000);

2
यह अधूरा है। setTimeपर निर्भर करता है new Date, जो आप शामिल नहीं हैं। कृपया जवाब पूरा करें।
random_user_name

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