समयक्षेत्र जावास्क्रिप्ट के बिना पार्स तारीख


147

मैं जावास्क्रिप्ट में timezone के बिना तारीख पार्स करना चाहता हूँ। मैंने कोशिश की है:

new Date(Date.parse("2005-07-08T00:00:00+0000"));

रिटर्न शुक्र जुलाई 08 2005 02:00:00 GMT + 0200 (मध्य यूरोपीय डेलाइट समय)

new Date(Date.parse("2005-07-08 00:00:00 GMT+0000"));

वही परिणाम देता है

new Date(Date.parse("2005-07-08 00:00:00 GMT-0000"));

वही परिणाम देता है

मैं समय पार्स करना चाहता हूं:

  1. समय क्षेत्र के बिना।

  2. निर्माता को बुलाए बिना Date.UTC या नई तिथि (वर्ष, माह, दिन)।

  3. डेट कंस्ट्रक्टर (प्रोटोटाइप तरीकों के बिना) में बस साधारण पासिंग स्ट्रिंग।

  4. मुझे प्रोडक्ट Dateऑब्जेक्ट करना है, नहीं String


3
आप बस Date.parsebtw को छोड़ सकते हैं और सीधे Dateनिर्माणकर्ता को स्ट्रिंग पास कर सकते हैं ।
बरगी

1
मुझे यकीन नहीं है कि आपको इसकी आवश्यकता क्यों है लेकिन मुझे पूरा यकीन है कि तिथि हमेशा उपयोगकर्ता के स्थानीय समय क्षेत्र की होती है। यदि आप चाहते हैं कि आपका जावास्क्रिप्ट अन्य टाइमज़ोन के साथ काम करे, तो आपको तिथि के लिए एक आवरण ऑब्जेक्ट का उपयोग करना होगा, शायद यह आपके लिए काम करेगा: github.com/mde/timezone-js
HMR

1
Unfortunatelly, मुझे DateMongoDB में तारीखों की तुलना करने के लिए सही वस्तु प्राप्त करने के लिए ऑब्जेक्ट को कॉपी करना पड़ा :new Date(dateStart.getFullYear(), dateStart.getMonth(), dateStart.getDate())
Athlan

यदि आप एक समय के बिना किसी तिथि को पार्स करना चाहते हैं, तो आपको यह निर्दिष्ट करने की आवश्यकता है कि आप किस समय क्षेत्र को ग्रहण करना चाहते हैं, क्योंकि "2005-07-08" का अर्थ अलग-अलग समय क्षेत्रों में अलग-अलग चीजें हैं। मई 2020 तक, MDN प्रलेखन कार्यान्वयन में अंतर के कारण किसी भी बिट-इन डेट पार्सिंग विशेषताओं के खिलाफ सलाह देता है। हालाँकि, Date.parse ("2005-07-08") का उपयोग करके संभवतः 00:00 UTC का समय वापस आ जाएगा। दूसरी ओर डेट-फन्स पार्स, उसी तारीख स्ट्रिंग को पार्स करते हुए स्थानीय समय 00:00 पर वापस लौटेगा
एंडी

जवाबों:


106

तिथि को सही ढंग से पार्स किया गया है, यह सिर्फ स्टर्लिंग है जो इसे आपके स्थानीय समय क्षेत्र में परिवर्तित करता है:

let s = "2005-07-08T11:22:33+0000";
let d = new Date(Date.parse(s));

// this logs for me 
// "Fri Jul 08 2005 13:22:33 GMT+0200 (Central European Summer Time)" 
// and something else for you

console.log(d.toString()) 

// this logs
// Fri, 08 Jul 2005 11:22:33 GMT
// for everyone

console.log(d.toUTCString())

जावास्क्रिप्ट दिनांक ऑब्जेक्ट टाइमस्टैम्प हैं - वे केवल युग के बाद से कई मिलीसेकंड होते हैं। दिनांक ऑब्जेक्ट में कोई समयक्षेत्र जानकारी नहीं है। कौन सा कैलेंडर दिनांक (दिन, मिनट, सेकंड) यह टाइमस्टैम्प प्रतिनिधित्व करता है (व्याख्या का एक to...Stringतरीका) है।

उपरोक्त उदाहरण से पता चलता है कि तारीख को सही ढंग से पार्स किया जा रहा है - अर्थात, इसमें वास्तव में जीएमटी में "2005-07-08T11: 22: 33" के समान मिलीसेकंड की मात्रा होती है।


4
Unfortunatelly मुझे डेट ऑब्जेक्ट का उत्पादन करना है, स्ट्रिंग का नहीं।
एथलन

@ एथन: कुछ स्पष्टीकरण जोड़े।
जॉर्ज

1
मैंने इसकी जाँच की थी। मैं MongoDB क्वेरी में पार्स तारीख बीत चुके हैं new Date(Date.parse("2005-07-08T11:22:33+0000")), और तारीख निर्माता के माध्यम से कॉपी किया: new Date(dateStart.getFullYear(), dateStart.getMonth(), dateStart.getDate())। दोनों समाधान, अलग-अलग परिणाम, दूसरा सही! आपका उत्तर उपयोगी था, बस hunlock.com/blogs/Javascript_Dates-The_Complete_Rference में उल्लिखित है । यूपी।
एथलन

मेरे लिए पूरी तरह से काम किया - .toUTCString () टिकट था जिसने मुझे मूल दिए गए स्ट्रिंग से सही समय दिया। नई तिथि ("2016-08-22T19: 45: 00.0000000")। toUTCString ()
माइकल जियोवानी

38
जावास्क्रिप्ट तारीखों और समय में सभी बुराई की जड़ आपके पहले वाक्य में निहित है ... यह सिर्फ यह कहना है कि इसे अपने स्थानीय समयक्षेत्र में परिवर्तित करें ... इस में एकल जिम्मेदारी कहां है? .String विधि को केवल परिणाम को कड़ा करना चाहिए और इसे परिवर्तित नहीं करना चाहिए। अगर मैं चाहता हूं कि तारीख को परिवर्तित किया जाए तो मेरे पास ऐसा करने के लिए अन्य तरीके होने चाहिए।
लंगर

109

मेरे साथ भी वही दिक्कत है। मुझे स्ट्रिंग के रूप में एक तारीख मिलती है, उदाहरण के लिए: '2016-08-25T00: 00: 00', लेकिन मुझे सही समय के साथ डेट ऑब्जेक्ट रखना होगा। स्ट्रिंग को ऑब्जेक्ट में बदलने के लिए, मैं getTimezoneOffset का उपयोग करता हूं:

var date = new Date('2016-08-25T00:00:00')
var userTimezoneOffset = date.getTimezoneOffset() * 60000;
new Date(date.getTime() - userTimezoneOffset);

getTimezoneOffset()ईथर नकारात्मक या सकारात्मक मान लौटाएगा। यह दुनिया में हर स्थान पर काम करने के लिए घटाया जाना चाहिए।


6
मेरे पास एक ही मुद्दा है और यह मददगार पाया गया। हालाँकि, मैंने पाया कि यह डेलाइट सेविंग टाइम के कारण टाइम ज़ोन ऑफ़सेट्स को हैंडल नहीं करता है। उदाहरण: मैं पीएसटी में हूं इसलिए जीएमटी से मेरी वर्तमान ऑफसेट (मार्च में) -8: 00 है, लेकिन मई में यह -7: 00 होगी। मेरा समाधान गणना करने के लिए थाvar userTimezoneOffset = date.getTimezoneOffset()*60000;
mmh02

3
जब तक मैं एक पूर्ण बेवकूफ नहीं हूँ, यह वास्तव में गलत समय देता है। getTimezoneOffset()विपरीत दिशा में मिनटों की संख्या जो आप सोचेंगे - मेरा टाइमज़ोन अभी UTC-4 है, लेकिन getTimezoneOffset()एक सकारात्मक 240 लौटाता है। इसलिए इससे userTimezoneOffsetघटाया जाना चाहिए date.getTime(), इसमें जोड़ा नहीं जाना चाहिए ।
vaindil

1
मैं @vaindil के साथ सहमत हूँ जिसे आपको प्रतिस्थापित करना चाहिए। वकवा का घोल तभी काम करता है जब आप ग्रीनविच के सही पक्ष हों। वक्वा को इसे सही करना चाहिए।
३५ पर जने हरजू

1
आह! बहुत जल्द बोल दिया। यह अधिकांश टाइमज़ोन के लिए काम नहीं करता है। मैं पुष्टि कर सकता हूं कि GMT समय के साथ AEST & CEST को ऑफसेट करते समय यह एक गलत तारीख देता है।
saran3h

1
@vaindil अब परिणाम वही है जैसा new Date('2016-08-25T00:00:00Z')कि मुझे लगता है कि बिंदु में हेरफेर करना था new Date('2016-08-25T00:00:00Z')ताकि स्थानीय समय 0:00 के साथ प्रदर्शित हो लेकिन यह कोड छूट गयाZ
बर्बसन

14

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

var date = '2014-01-02T00:00:00.000Z'
date = date.substring(0,10).split('-')
date = date[1] + '-' + date[2] + '-' + date[0]

new Date(date) #Thu Jan 02 2014 00:00:00 GMT-0600

जो भी कारण '01 -02-2014 'में तारीख को पार करने के लिए समय-क्षेत्र को शून्य पर सेट करता है और उपयोगकर्ता के समय-क्षेत्र की उपेक्षा करता है। यह दिनांक वर्ग में एक अस्थायी हो सकता है लेकिन यह कुछ समय पहले मौजूद था और आज भी मौजूद है। और यह क्रॉस-ब्राउज़र काम करने लगता है। इसे अपने लिए आजमाएं।

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


मुझे लगता है कि यह जानबूझकर है क्योंकि "Z" यूटीसी को नामित करता है जो जेएस तब परिवर्तित करता है, लेकिन कोई समय क्षेत्र नहीं दिया गया है इसलिए इसे परिवर्तित नहीं किया जा सकता है इसलिए यह अनिवार्य रूप से उपयोगकर्ता के समय क्षेत्र को मानता है। हालांकि कुछ पुष्टि या बेहतर स्पष्टीकरण प्राप्त करना पसंद करेंगे।
डेल्सो 23

7
विस्की का व्यवहार डैश के कारण होता है। क्रोम, फ़ायरफ़ॉक्स, और IE11 सभी व्याख्या करते हैं 2014/5/31और 2014/05/3131 मई 2014 के रूप में 00:00:00 GMT-0600 (माउंटेन डेलाइट टाइम) `(एमडीटी मेरा वर्तमान समयक्षेत्र है)। डैश के साथ ... सभी ब्राउज़र 2014-05-3130 मई 2014 18:00:00 GMT-0600 (माउंटेन डेलाइट टाइम) के रूप में व्याख्या करते हैं। अजीब तरह से 2014-5-31, क्रोम शनिवार को लौटता है, फ़ायरफ़ॉक्स शुक्रवार को लौटता है, और IE11 कहता है कि तारीख अमान्य है। लगता है जैसे कोई date.replace('-','/')चाल चल सकता है।
अथिया जूल

6

Dateवस्तु ही वैसे भी समय क्षेत्र में शामिल होंगे, और लौट आए परिणाम स्ट्रिंग के लिए यह एक डिफ़ॉल्ट रास्ते में परिवर्तित करने का प्रभाव है। यानी आप टाइमज़ोन के बिना डेट ऑब्जेक्ट नहीं बना सकते । लेकिन आप जो कर सकते हैं, वह यह है कि आप Dateअपने स्वयं के निर्माण के द्वारा वस्तु के व्यवहार की नकल करें । हालांकि, यह क्षणों की तरह पुस्तकालयों को सौंप दिया जाना बेहतर है ।


2
Unfortunatelly मुझे डेट ऑब्जेक्ट का उत्पादन करना है, स्ट्रिंग का नहीं।
एथलन

3

सरल समाधान

const handler1 = {
  construct(target, args) {
    let newDate = new target(...args);
    var tzDifference = newDate.getTimezoneOffset();
    return new target(newDate.getTime() + tzDifference * 60 * 1000);
  }
};

Date = new Proxy(Date, handler1);

3

जावास्क्रिप्ट में तारीख बस इसे अंदर सरल रख रही है। इसलिए डेट-टाइम डेटा यूटीसी यूनिक्स युग (मिलीसेकंड या एमएस) में संग्रहित किया जाता है।

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

दिनांक बचाने के लिए (एमएस में)

toUTC(datetime) {
  const myDate = (typeof datetime === 'number')
    ? new Date(datetime)
    : datetime;

  if (!myDate || (typeof myDate.getTime !== 'function')) {
    return 0;
  }

  const getUTC = myDate.getTime();
  const offset = myDate.getTimezoneOffset() * 60000; // It's in minutes so convert to ms
  return getUTC - offset; // UTC - OFFSET
}

दिनांक (एमएस में) दिखाने के लिए

fromUTC(datetime) {
  const myDate = (typeof datetime === 'number')
    ? new Date(datetime)
    : datetime;

  if (!myDate || (typeof myDate.getTime !== 'function')) {
    return 0;
  }

  const getUTC = myDate.getTime();
  const offset = myDate.getTimezoneOffset() * 60000; // It's in minutes so convert to ms
  return getUTC + offset; // UTC + OFFSET
}

तब आप कर सकते हो:

const saveTime = new Date(toUTC(Date.parse("2005-07-08T00:00:00+0000")));
// SEND TO DB....

// FROM DB...
const showTime = new Date(fromUTC(saveTime));

2

आप इस कोड का उपयोग कर सकते हैं

var stringDate = "2005-07-08T00:00:00+0000";
var dTimezone = new Date();
var offset = dTimezone.getTimezoneOffset() / 60;
var date = new Date(Date.parse(stringDate));
date.setHours(date.getHours() + offset);

1
मुझे विश्वास नहीं है कि यह दिन की बचत को ध्यान में रखता है
डैनियल थॉम्पसन

2

चूंकि दिनांक प्रदर्शित करते समय यह वास्तव में एक प्रारूपण मुद्दा है (जैसे कि स्थानीय समय में प्रदर्शित होता है), मैं प्रारूपण करने के लिए नए (ish) Intl.DateTimeFormat ऑब्जेक्ट का उपयोग करना पसंद करता हूं क्योंकि यह अधिक स्पष्ट है और अधिक आउटपुट विकल्प प्रदान करता है:

const dateOptions = { timeZone: 'UTC', month: 'long', day: 'numeric', year: 'numeric' };

const dateFormatter = new Intl.DateTimeFormat('en-US', dateOptions);
const dateAsFormattedString = dateFormatter.format(new Date('2019-06-01T00:00:00.000+00:00'));

console.log(dateAsFormattedString) // "June 1, 2019"

जैसा कि दिखाया गया है, टाइमजोन को, यूटीसी ’में सेट करके यह स्थानीय रूपांतरण नहीं करेगा। एक बोनस के रूप में, यह आपको अधिक पॉलिश किए गए आउटपुट बनाने की अनुमति भी देता है। आप मोज़िला से Intl.DateTimeFormat ऑब्जेक्ट के बारे में अधिक पढ़ सकते हैं - Intl.DateTimeFormat

संपादित करें:

नई Intl.DateTimeFormatवस्तु बनाए बिना उसी कार्यक्षमता को प्राप्त किया जा सकता है । बस toLocaleDateString()समारोह में सीधे स्थान और तारीख विकल्प पास करें ।

const dateOptions = { timeZone: 'UTC', month: 'long', day: 'numeric', year: 'numeric' };
const myDate = new Date('2019-06-01T00:00:00.000+00:00');
today.toLocaleDateString('en-US', dateOptions); // "June 1, 2019"

1

बस एक सामान्य नोट। इसे लचीला रखने का एक तरीका

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

हम getMinutes () का उपयोग कर सकते हैं, लेकिन यह पहले 9 मिनट के लिए केवल एक नंबर लौटाता है।

let epoch = new Date() // Or any unix timestamp

let za = new Date(epoch),
    zaR = za.getUTCFullYear(),
    zaMth = za.getUTCMonth(),
    zaDs = za.getUTCDate(),
    zaTm = za.toTimeString().substr(0,5);

console.log(zaR +"-" + zaMth + "-" + zaDs, zaTm)

Date.prototype.getDate()
    Returns the day of the month (1-31) for the specified date according to local time.
Date.prototype.getDay()
    Returns the day of the week (0-6) for the specified date according to local time.
Date.prototype.getFullYear()
    Returns the year (4 digits for 4-digit years) of the specified date according to local time.
Date.prototype.getHours()
    Returns the hour (0-23) in the specified date according to local time.
Date.prototype.getMilliseconds()
    Returns the milliseconds (0-999) in the specified date according to local time.
Date.prototype.getMinutes()
    Returns the minutes (0-59) in the specified date according to local time.
Date.prototype.getMonth()
    Returns the month (0-11) in the specified date according to local time.
Date.prototype.getSeconds()
    Returns the seconds (0-59) in the specified date according to local time.
Date.prototype.getTime()
    Returns the numeric value of the specified date as the number of milliseconds since January 1, 1970, 00:00:00 UTC (negative for prior times).
Date.prototype.getTimezoneOffset()
    Returns the time-zone offset in minutes for the current locale.
Date.prototype.getUTCDate()
    Returns the day (date) of the month (1-31) in the specified date according to universal time.
Date.prototype.getUTCDay()
    Returns the day of the week (0-6) in the specified date according to universal time.
Date.prototype.getUTCFullYear()
    Returns the year (4 digits for 4-digit years) in the specified date according to universal time.
Date.prototype.getUTCHours()
    Returns the hours (0-23) in the specified date according to universal time.
Date.prototype.getUTCMilliseconds()
    Returns the milliseconds (0-999) in the specified date according to universal time.
Date.prototype.getUTCMinutes()
    Returns the minutes (0-59) in the specified date according to universal time.
Date.prototype.getUTCMonth()
    Returns the month (0-11) in the specified date according to universal time.
Date.prototype.getUTCSeconds()
    Returns the seconds (0-59) in the specified date according to universal time.
Date.prototype.getYear()
    Returns the year (usually 2-3 digits) in the specified date according to local time. Use getFullYear() instead. 

-1

(new Date().toString()).replace(/ \w+-\d+ \(.*\)$/,"")

इसका आउटपुट होगा: Tue Jul 10 2018 19:07:11

(new Date("2005-07-08T11:22:33+0000").toString()).replace(/ \w+-\d+ \(.*\)$/,"")

इसका आउटपुट होगा: शुक्र जुलाई 08 2005 04:22:33

नोट: लौटाया गया समय आपके स्थानीय समयक्षेत्र पर निर्भर करेगा


-1

यही वह समाधान है जो मैं इस समस्या के लिए आया था जो मेरे लिए काम करती है।


पुस्तकालय का इस्तेमाल किया: सादे जावास्क्रिप्ट तिथि वर्ग के साथ गति।

चरण 1. स्ट्रिंग तिथि को ऑब्जेक्ट में बदलें (PS: पल मूल तिथि और समय को बनाए रखता है जब तक कि toDate()विधि को नहीं कहा जाता है):

const dateMoment = moment("2005-07-08T11:22:33+0000");

चरण 2. पहले बनाए गए क्षण ऑब्जेक्ट से निकालें hoursऔर minutesमान:

  const hours = dateMoment.hours();
  const mins = dateMoment.minutes();

चरण 3. तिथि में परिवर्तित करें (PS: यह आपके ब्राउज़र / मशीन के टाइमज़ोन के आधार पर मूल तिथि को बदल देगा, लेकिन चिंता न करें और चरण 4 पढ़ें):

  const dateObj = dateMoment.toDate();

चरण 4. मैन्युअल रूप से चरण 2 में निकाले गए घंटे और मिनट सेट करें।

  dateObj.setHours(hours);
  dateObj.setMinutes(mins);

चरण 5 dateObjमें अब बिना किसी समयक्षेत्र अंतर के मूल तिथि दिखाई जाएगी। यहां तक ​​कि डेलाइट समय में परिवर्तन का भी दिनांक ऑब्जेक्ट पर कोई प्रभाव नहीं पड़ेगा क्योंकि हम मैन्युअल रूप से मूल घंटे और मिनट सेट कर रहे हैं।

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


-7

डेट पार्सिंग के साथ कुछ अंतर्निहित समस्याएं हैं जो दुर्भाग्य से डिफ़ॉल्ट रूप से अच्छी तरह से संबोधित नहीं की जाती हैं।

-उच्च पठनीय तिथियों में अंतर्निहित समयक्षेत्र
होता है। वेब के आसपास कई व्यापक रूप से उपयोग किए जाने वाले प्रारूप हैं जो अस्पष्ट हैं

इन समस्याओं को आसान और साफ हल करने के लिए इस तरह के एक समारोह की आवश्यकता होगी:

>parse(whateverDateTimeString,expectedDatePattern,timezone)
"unix time in milliseconds"

मैंने इसके लिए खोज की है, लेकिन ऐसा कुछ नहीं मिला!

इसलिए मैंने बनाया: https://github.com/zsoltszabo/timestamp-grabber

का आनंद लें!

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