दिलचस्प पोस्ट
सी # में एक स्ट्रिंग एन्कोडिंग निर्धारित करें मैं बाश में एक सीमांकक पर स्ट्रिंग कैसे विभाजित करूं? विभिन्न स्क्रीन के लिए गतिशील रूप से टेक्स्टएव का टेक्स्ट आकार कैसे सेट करें सी में संकेतक: जब ऐपरसैंड और तारांकन का उपयोग करें? जावा आदेशित मानचित्र PHP में जेएसएन अनुरोध संभाल गतिशील बनाम ऑब्जेक्ट प्रकार वेबजीएल समर्थन का पता लगाने का सही तरीका है? क्यों सिस्टम.रात्रिकॉपी जावा में मूल है? एकाधिक (3+) उपकरणों के साथ वाईफ़ाई डायरेक्ट (एंड्रॉइड 4.0) जावा में दो सेटों के बीच सममित अंतर का सबसे अच्छा तरीका क्या है? क्या git alias द्वारा git कमांड ओवरराइड करना संभव है? Django में एकाधिक फ़िल्टर (चेनिंग), क्या यह एक बग है? विज्ञापनप्रणाली और पहचानकर्ता फ़ोरेन्डर वापसी "00000000-0000-0000-0000-000000000000" पायथन 3.6 में चर एनोटेशन क्या हैं?

क्यों तारीख। गलत गलत परिणाम देते हैं?

प्रकरण एक:

new Date(Date.parse("Jul 8, 2005")); 

आउटपुट:

शुक्र जुलाई 08 2005 00:00:00 GMT-0700 (पीएसटी)

केस दो:

 new Date(Date.parse("2005-07-08")); 

आउटपुट:

गुरु 07 जुलाई 2005 17:00:00 GMT-0700 (पीएसटी)


दूसरा पार्स गलत क्यों है?

Solutions Collecting From Web of "क्यों तारीख। गलत गलत परिणाम देते हैं?"

जब तक 5 वें संस्करण का Date.parse आया, तो Date.parseDate.parse विधि पूरी तरह से कार्यान्वयन निर्भर था ( new Date(string) बराबर है। Date.parse(string) को छोड़कर, बाद में कोई Date बजाय एक नंबर लौटाता है)। 5 वें संस्करण की कल्पना में एक सरलीकृत (और थोड़ा गलत) आईएसओ Date.parse का समर्थन करने के लिए जोड़ा गया था, लेकिन इसके अलावा, उस new Date(string) लिए कोई आवश्यकता नहीं थी। Date.parse / new Date(string) को उस की तुलना में अन्य को स्वीकार करना चाहिए जो भी Date#toString आउटपुट को स्वीकार करें (जो कह रहा था उसे नहीं)।

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

 // parse a date in yyyy-mm-dd format function parseDate(input) { var parts = input.split('-'); // new Date(year, month [, day [, hours[, minutes[, seconds[, ms]]]]]) return new Date(parts[0], parts[1]-1, parts[2]); // Note: months are 0-based } 

एक जेएस अनुवादक लिखने के हाल के अनुभव के दौरान मैंने ईसीएमए / जेएस दिनांक के अंदरूनी कामकाज के साथ काफी मल्लयुद्ध किया। तो, मैं समझता हूं कि मैं यहां 2 सेंट में फेंक दूँगा। उम्मीद है कि यह सामान साझा करने से अन्य लोगों को तारीखों को संभालने में ब्राउज़रों के बीच के अंतर के बारे में कोई भी प्रश्न पूछेगा।

इनपुट साइड

सभी कार्यान्वयन आंतरिक रूप से उनकी दिनांक मानों को 64-बिट संख्या के रूप में संग्रहीत करते हैं जो 1/1/1 9 70 यूटीसी (जीएमटी यूटीसी के समान ही है) के बाद मिलीसेकंड की संख्या का प्रतिनिधित्व करते हैं। 1/1/1970 00:00:00 बाद होने वाली तिथियां सकारात्मक संख्याएं हैं और पूर्व तिथियां ऋणात्मक हैं।

इसलिए, निम्न कोड सभी ब्राउज़रों पर सटीक समान परिणाम उत्पन्न करता है।

 Date.parse('1/1/1970'); 

मेरे समयक्षेत्र (ईएसटी) में, परिणाम 18000000 है क्योंकि यह कितने एमएस 5 घंटे में हैं (डेलाइट बचत महीनों में केवल 4 घंटे)। मूल्य भिन्न समय क्षेत्रों में अलग होगा। सभी प्रमुख ब्राउज़रों ने ऐसा ही किया है

यहाँ हालांकि रगड़ है इनपुट स्ट्रिंग स्वरूपों में कुछ भिन्नताएं होती हैं, जो प्रमुख ब्राउज़रों को दिनांक के रूप में पार्स करते हैं, वे अनिवार्य रूप से उन्हें समय क्षेत्र और डेलाइट बचत का संबंध रखते हैं। एक धारणा आईएसओ 8601 प्रारूप है। ईसीएमए -262 v.5 स्पेस में विशेष रूप से यह एकमात्र प्रारूप है। अन्य सभी स्ट्रिंग प्रारूपों के लिए, व्याख्या कार्यान्वयन-निर्भर है। विडंबना यह है कि यह वह प्रारूप है जहां ब्राउज़र भिन्न हो सकते हैं। आईएसओ 8601 स्ट्रिंग फ़ॉर्मेट का उपयोग करके मेरी मशीन पर 1/1/1970 के लिए क्रोम बनाम फ़ायरफ़ॉक्स का एक तुलनात्मक उत्पादन यहाँ है।

 Date.parse('1970-01-01T00:00:00Z'); // Chrome: 0 FF: 0 Date.parse('1970-01-01T00:00:00-0500'); // Chrome: 18000000 FF: 18000000 Date.parse('1970-01-01T00:00:00'); // Chrome: 0 FF: 18000000 
  • "Z" निर्दिष्टकर्ता इंगित करता है कि इनपुट पहले से ही यूटीसी समय में है और भंडारण से पहले ऑफसेट की आवश्यकता नहीं है।
  • "-0500" स्पेसिफायर इंगित करता है कि इनपुट जीएमटी -5: 00 में है इसलिए दोनों ब्राउज़रों इनपुट की व्याख्या मेरे स्थानीय समय क्षेत्र में होने के रूप में करते हैं। इसका अर्थ है कि मूल्य संग्रहीत होने से पहले यूटीसी में कनवर्ट किया जाता है। मेरे मामले में, इसका मतलब है कि 18000000 एमएमएस को तिथि के आंतरिक मूल्य से जोड़कर इस प्रकार एक -18000000 एमएमएस (-5: 00) स्थानांतरित करने के लिए मुझे स्थानीय समय में वापस लाने की आवश्यकता होती है।
  • जब कोई विनिर्देशक नहीं होता है, तो एफएफ स्थानीय समय के रूप में इनपुट का इलाज करता है, जबकि क्रोम उसे यूटीसी समय के रूप में मानता है। मेरे लिए यह संचित मूल्य में 5 घंटे का अंतर बनाता है, जो समस्याग्रस्त है मेरे कार्यान्वयन में मैं एफएफ के साथ साइडिंग समाप्त कर रहा था क्योंकि मुझे toString का आउटपुट मेरे इनपुट वैल्यू से मेल करने के लिए पसंद है जब तक कि मैं एक वैकल्पिक टाइमज़ोन निर्दिष्ट न करें, जो मैंने कभी नहीं किया। किसी विनिर्देशक की अनुपस्थिति को स्थानीय समय इनपुट का अनुमान करना चाहिए।

लेकिन यहां जहां यह खराब हो जाता है, एफएफ आईएसओ 8601 प्रारूप ("YYYY-MM-DD") के संक्षिप्त रूप को अलग तरीके से मानता है क्योंकि यह लंबे समय तक ("YYYY-MM-DDTHH: mm: ss: sssZ") के लिए व्यवहार करता है कोई तार्किक कारण नहीं यहां कोई समय क्षेत्र विनिर्देशक के साथ लंबे और छोटे आईएसओ दिनांक प्रारूपों के साथ एफएफ से आउटपुट दिया गया है।

 Date.parse('1970-01-01T00:00:00'); // 18000000 Date.parse('1970-01-01'); // 0 

अतः, मूल पूछने वाले के प्रश्न के सीधे उत्तर देने के लिए, "YYYY-MM-DD" आईएसओ 8601 प्रारूप "YYYY-MM-DDTHH:mm:ss:sssZ" इसलिए, इसे यूटीसी समय के रूप में व्याख्या किया जाता है जबकि अन्य को स्थानीय रूप में समझा जाता है। इसीलिए,

यह जीवा नहीं करता है:

 console.log(new Date(Date.parse("Jul 8, 2005")).toString()); console.log(new Date(Date.parse("2005-07-08")).toString()); 

यह करता है:

 console.log(new Date(Date.parse("Jul 8, 2005")).toString()); console.log(new Date(Date.parse("2005-07-08T00:00:00")).toString()); 

नीचे की रेखा इस तारीख तार को पार्स करने के लिए है। केवल आईएसओ 8601 की स्ट्रिंग जो आप ब्राउजरों में सुरक्षित रूप से पार्स कर सकते हैं, वह लंबे फॉर्म है। और, हमेशा "Z" विनिर्देशक का उपयोग करें यदि आप ऐसा करते हैं तो आप स्थानीय और यूटीसी समय के बीच सुरक्षित रूप से पीछे जा सकते हैं।

यह ब्राउज़र भर में काम करता है (IE9 के बाद):

 console.log(new Date(Date.parse("2005-07-08T00:00:00Z")).toString()); 

सौभाग्य से, अधिकांश वर्तमान ब्राउज़रों अन्य इनपुट प्रारूपों का समान रूप से इलाज करते हैं, जिसमें सबसे अधिक बार उपयोग किए जाने वाले '1/1/1970' और '1/1/1970 00:00:00 पूर्वाह्न' प्रारूप शामिल होते हैं। सभी स्वरूपों (और अन्य) को सभी ब्राउज़रों में स्थानीय समय इनपुट के रूप में माना जाता है और भंडारण से पहले यूटीसी में कनवर्ट किया जाता है। इस प्रकार, उन्हें क्रॉस-ब्राउज़र संगत बनाना। इस कोड का आउटपुट मेरे समयक्षेत्र में सभी ब्राउज़रों में समान है I

 console.log(Date.parse("1/1/1970")); console.log(Date.parse("1/1/1970 12:00:00 AM")); console.log(Date.parse("Thu Jan 01 1970")); console.log(Date.parse("Thu Jan 01 1970 00:00:00")); console.log(Date.parse("Thu Jan 01 1970 00:00:00 GMT-0500")); 

आउटपुट साइड

आउटपुट की तरफ, सभी ब्रॉउर्स समय क्षेत्र का उसी तरह अनुवाद करते हैं लेकिन वे स्ट्रिंग फ़ॉर्मेट को अलग तरीके से संभालते हैं। ये toString फ़ंक्शन हैं और वे क्या आउटपुट हैं अपने मशीन पर toUTCString और toISOString कार्य आउटपुट 5:00 पूर्वाह्न देखें।

प्रिंटिंग से पहले यूटीसी से स्थानीय समय में कनवर्ट करता है

  - toString - toDateString - toTimeString - toLocaleString - toLocaleDateString - toLocaleTimeString 

संग्रहीत UTC समय को सीधे प्रिंट करता है

  - toUTCString - toISOString 

  क्रोम में 
 toString Thu Jan 01 1970 00:00:00 GMT-05:00 (Eastern Standard Time) toDateString Thu Jan 01 1970 toTimeString 00:00:00 GMT-05:00 (Eastern Standard Time) toLocaleString 1/1/1970 12:00:00 AM toLocaleDateString 1/1/1970 toLocaleTimeString 00:00:00 AM toUTCString Thu, 01 Jan 1970 05:00:00 GMT toISOString 1970-01-01T05:00:00.000Z 

  फ़ायरफ़ॉक्स में 
 toString Thu Jan 01 1970 00:00:00 GMT-05:00 (Eastern Standard Time) toDateString Thu Jan 01 1970 toTimeString 00:00:00 GMT-0500 (Eastern Standard Time) toLocaleString Thursday, January 01, 1970 12:00:00 AM toLocaleDateString Thursday, January 01, 1970 toLocaleTimeString 12:00:00 AM toUTCString Thu, 01 Jan 1970 05:00:00 GMT toISOString 1970-01-01T05:00:00.000Z 

मैं आमतौर पर स्ट्रिंग इनपुट के लिए आईएसओ प्रारूप का उपयोग नहीं करता। उस प्रारूप का उपयोग करने का एकमात्र समय मेरे लिए फायदेमंद होता है, जब दिनांक तारों के रूप में सॉर्ट करने की आवश्यकता होती है आईएसओ फॉर्मेट सॉर्ट करने योग्य है, जबकि अन्य नहीं हैं। यदि आपको क्रॉस-ब्राउज़र संगतता है, तो समय क्षेत्र निर्दिष्ट करें या एक संगत स्ट्रिंग प्रारूप का उपयोग करें।

कोड new Date('12/4/2013').toString() निम्नलिखित आंतरिक छद्म-रूपांतरण के माध्यम से चला जाता है:

  "12/4/2013" -> toUCT -> [storage] -> toLocal -> print "12/4/2013" 

मुझे उम्मीद है कि यह उत्तर सहायक था।

पागलपन के लिए कुछ विधि है एक सामान्य नियम के रूप में, यदि कोई ब्राउज़र आईएसओ -8601 के रूप में किसी तारीख को व्याख्या कर सकता है, तो यह होगा। "2005-07-08" इस शिविर में पड़ता है, और इसलिए इसे यूटीसी के रूप में पार्स किया जाता है। "8 जुलाई, 2005" नहीं, और इसलिए इसे स्थानीय समय में पार्स किया जाता है।

जावास्क्रिप्ट और तिथियां देखें , क्या मैस! अधिक जानकारी के लिए।

एक और समाधान डेट फॉरमेट के साथ एक एसोसिएटिव सरणी का निर्माण करना है और फिर डेटा को पुन: स्वरूपित करना है।

यह पद्धति किसी अप्रत्यक्ष तरीके से स्वरूपित तिथि के लिए उपयोगी है।

एक उदाहरण:

  mydate='01.02.12 10:20:43': myformat='dd/mm/yy HH:MM:ss'; dtsplit=mydate.split(/[\/ .:]/); dfsplit=myformat.split(/[\/ .:]/); // creates assoc array for date df = new Array(); for(dc=0;dc<6;dc++) { df[dfsplit[dc]]=dtsplit[dc]; } // uses assc array for standard mysql format dstring[r] = '20'+df['yy']+'-'+df['mm']+'-'+df['dd']; dstring[r] += ' '+df['HH']+':'+df['MM']+':'+df['ss']; 

http://blog.dygraphs.com/2012/03/javascript-and-dates-what-mess.html के अनुसार प्रारूप "yyyy / mm / dd" सामान्य समस्याओं को हल करता है वह कहता है: "जब भी संभव हो तो अपने तार तार के लिए" YYYY / MM / DD "को चिपकाएं। यह सार्वभौमिक रूप से समर्थित और स्पष्ट है। इस प्रारूप के साथ, हर समय स्थानीय है।" मैंने परीक्षण सेट किए हैं: http://jsfiddle.net/jlanus/ND2Qg/432/ यह प्रारूप: + ymd आदेश और एक 4 अंकों वाले वर्ष का उपयोग करके दिन और महीने के आदेश अस्पष्टता से बचा जाता है + यूटीसी बनाम स्थानीय मुद्दे से बचा जाता है स्लैश + डेनवक का प्रयोग करके आईएसओ फॉर्मेट का अनुपालन करते हुए, डायग्राफ्स आदमी कहते हैं कि यह प्रारूप सभी ब्राउज़रों में अच्छा है।

सीएमएस सही है कि पार्स विधि में स्ट्रिंग्स गुजरने से असुरक्षित होता है, धारा 15.9.4.2 में नया ईसीएमए -262 5 वें संस्करण (उर्फ एएस 5 ) विनिर्देश बताता है कि Date.parse() वास्तव में आईएसओ-प्रारूपित तारीखों को संभालना चाहिए। पुराने विनिर्देशन ने ऐसा कोई दावा नहीं किया। बेशक, पुराने ब्राउज़रों और कुछ मौजूदा ब्राउज़रों अभी भी इस ES5 कार्यक्षमता प्रदान नहीं करते हैं

आपका दूसरा उदाहरण गलत नहीं है यह यूटीसी में निर्दिष्ट दिनांक है, जैसा कि Date.prototype.toISOString() द्वारा निहित है, लेकिन आपके स्थानीय समयक्षेत्र में दर्शाया गया है।

तिथियों को पार्स करने के लिए moment.js का उपयोग करें:

 var caseOne = moment("Jul 8, 2005", "MMM D, YYYY", true).toDate(); var caseTwo = moment("2005-07-08", "YYYY-MM-DD", true).toDate(); 

तीसरी तर्क सख्त पार्सिंग निर्धारित करता है (2.3.0 के रूप में उपलब्ध है)। इसके बिना moment.js भी गलत परिणाम दे सकता है।

इस हल्के वजन की तारीख पार्सिंग पुस्तकालय सभी समान समस्याओं को हल करना चाहिए। मुझे पुस्तकालय पसंद है क्योंकि यह विस्तार करने के लिए काफी आसान है। यह i18n भी हो सकता है (बहुत सीधे आगे नहीं, लेकिन यह मुश्किल नहीं है)।

पार्सिंग उदाहरण:

 var caseOne = Date.parseDate("Jul 8, 2005", "M d, Y"); var caseTwo = Date.parseDate("2005-07-08", "Ymd"); 

और स्ट्रिंग पर वापस स्वरूपण करना (आप देखेंगे कि दोनों ही मामले बिल्कुल समान परिणाम देते हैं):

 console.log( caseOne.dateFormat("M d, Y") ); console.log( caseTwo.dateFormat("M d, Y") ); console.log( caseOne.dateFormat("Ymd") ); console.log( caseTwo.dateFormat("Ymd") ); 

यहाँ एक संक्षिप्त, लचीली स्निपेट है जिसे डॉट-टाइम-स्ट्रिंग को क्रॉस-ब्राउजर-सुरक्षित फ़ैक्स में परिवर्तित किया गया है, जैसा कि @ drankin2112 द्वारा विस्तृत किया गया निकेल।

 var inputTimestamp = "2014-04-29 13:00:15"; //example var partsTimestamp = inputTimestamp.split(/[ \/:-]/g); if(partsTimestamp.length < 6) { partsTimestamp = partsTimestamp.concat(['00', '00', '00'].slice(0, 6 - partsTimestamp.length)); } //if your string-format is something like '7/02/2014'... //use: var tstring = partsTimestamp.slice(0, 3).reverse().join('-'); var tstring = partsTimestamp.slice(0, 3).join('-'); tstring += 'T' + partsTimestamp.slice(3).join(':') + 'Z'; //configure as needed var timestamp = Date.parse(tstring); 

आपके ब्राउज़र को उसी टाइमस्टैम्प परिणाम को Date.parse रूप में प्रदान करना चाहिए। Date.parse साथ:

 (new Date(tstring)).getTime()