सवाल जावास्क्रिप्ट में तारीख पार्सिंग सफारी और क्रोम के बीच अलग है


मेरे पास निम्न कोड है

var c = new Date(Date.parse("2011-06-21T14:27:28.593Z"));
console.log(c);

क्रोम पर यह कंसोल पर तारीख को सही ढंग से प्रिंट करता है। सफारी में यह विफल रहा। कौन सही है और सबसे महत्वपूर्ण बात यह है कि सबसे अच्छा तरीका क्या है इसे संभालने के लिए?


44
2018-06-21 14:44


मूल


वे दोनों मुझे देते हैं Tue Jun 21 2011 10:27:28 GMT-0400 (Eastern Daylight Time) - Robert
पक्की बात। jsfiddle.net/A26Gu सफारी पर चलाएं संस्करण 5.0.4 (6533.20.27) मुझे "अमान्य तिथि" के कंसोल में आउटपुट देता है - bradgonesurfing
आप दो बार डेट ऑब्जेक्ट क्यों बनाते हैं? सही की आपकी परिभाषा क्या है? आप 'Date.toISOString ()' विधि का उपयोग कर सकते हैं। लेकिन ध्यान रखें: यह पुराने ब्राउज़र द्वारा समर्थित नहीं है। - Wolfgang Kuehn
हम्म, अजीब ... मैंने बस इसे कंसोल में चलाया, इसके लिए एक पेज बनाने से परेशान नहीं किया। यह कंसोल में काम करता था जब मैंने कुछ भी किए बिना JSFiddle खींच लिया, लेकिन कोई अन्य पृष्ठ NaN देता है। इसके अलावा, मैं 5.0.5 (7533.21.1) चला रहा हूँ - Robert
जावास्क्रिप्ट दिनांक ओएस से 2 टाइमज़ोन, यूटीसी और स्थानीय एक का समर्थन करता है। आप सुनिश्चित नहीं कर सकते कि स्थानीय टाइमज़ोन सही सेट है। और जैसा कि जावास्क्रिप्ट क्लाइंट साइड है, आप वास्तव में भरोसा नहीं कर सकते हैं कि यह कुछ भी सही करता है - यहां तक ​​कि पार्सिंग तिथियां भी नहीं। किसी भी आवेदन महत्वपूर्ण गणना सर्वर पक्ष किया जाना चाहिए। - Erik


जवाब:


आप वास्तव में Date.parse का उपयोग नहीं कर सकते हैं। मेरा सुझाव है कि आप इसका उपयोग करें: new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )

स्ट्रिंग को विभाजित करने के लिए आप कोशिश कर सकते हैं

var s = '2011-06-21T14:27:28.593Z';
var a = s.split(/[^0-9]/);
//for (i=0;i<a.length;i++) { alert(a[i]); }
var d=new Date (a[0],a[1]-1,a[2],a[3],a[4],a[5] );
alert(s+ " "+d);

81
2018-06-21 14:52



ये दिनांक तार सर्वर से आ रहे हैं। यदि आपके पास अलग-अलग घटकों में उन्हें पार्स करने का कोई तरीका है तो मुझे सुनने में खुशी होगी। - bradgonesurfing
मैं विभाजित funktion का उपयोग करेंगे: javascript.about.com/od/hintsandtips/a/javascriptsplit.htm - Erik
उत्तर में विभाजित विभाजन का उपयोग - Erik
यह केवल तभी काम करता है जब स्थानीय समय में तिथियां दी जाती हैं। यह टाइमज़ोन स्ट्रिप्स करता है और स्थानीय लागू होता है। उदाहरण: आप -0500 टाइमज़ोन में हैं, आप इसे 11 बजे यूटीसी भेजते हैं, आपको 6am स्थानीय वापस मिलना चाहिए, लेकिन इसके बजाय आप 11am स्थानीय वापस आते हैं। - dlsso
जैसा कि disso कहते हैं, यह जवाब टाइमज़ोन को अनदेखा करता है। यह ऑफ़सेट 00:00 ("ज़ेड") के साथ एक स्ट्रिंग लेता है और इसे स्थानीय रूप में पार्स करता है। दिनांक .UTC का उपयोग किया जाना चाहिए था। - RobG


मैं टालना चाहता हूँ Date.parse, इस प्रश्न के अन्य उत्तरों के अनुसार। यह तारीखों के साथ भरोसेमंद तरीके से निपटने के लिए एक पोर्टेबल तरीका प्रतीत नहीं होता है।

इसके बजाय, मैंने नीचे दिए गए फ़ंक्शन की तरह कुछ उपयोग किया है। यह स्ट्रिंग सरणी को एक संख्या सरणी में मैप करने के लिए jQuery का उपयोग करता है, लेकिन यह हटाने / बदलने के लिए एक बहुत ही आसान निर्भरता है। मैं आपको समझने के लिए समझने के लिए समझदार डिफ़ॉल्ट पर विचार करता हूं 2007-01-09 तथा 2007-01-09T09:42:00 एक ही समारोह का उपयोग कर।

function dateFromString(str) {
  var a = $.map(str.split(/[^0-9]/), function(s) { return parseInt(s, 10) });
  return new Date(a[0], a[1]-1 || 0, a[2] || 1, a[3] || 0, a[4] || 0, a[5] || 0, a[6] || 0);
}

13
2018-02-23 12:38



एक बहुत अच्छा हैक jabley। - Bingy


मैंने इसे कई ब्राउज़रों में चेक किया है, और हाँ, सफारी रिटर्न invalid date। वैसे, आपको उपयोग करने की ज़रूरत नहीं है Date.parse यहाँ, बस new Date([datestring]) भी काम करेगा सफारी को स्पष्ट रूप से आपके द्वारा आपूर्ति की जाने वाली तिथि के अधिक स्वरूपण की आवश्यकता होती है। यदि आप '-' को '/' से प्रतिस्थापित करते हैं, तो टी (.593Z) के बाद टी और सबकुछ हटा दें, यह आपको एक वैध तिथि देगा। सफारी में यह कोड परीक्षण और काम करता है

var datestr = '2011-06-21T14:27:28.593Z'.split(/[-T.]/);
var safdat = new Date( datestr.slice(0,3).join('/')+' '+datestr[3] );

या प्रयोग कर रहे हैं String.replace(...):

new Date("2016-02-17T00:05:01+0000".replace(/-/g,'/').replace('T',' ').replace(/(\..*|\+.*/,""))

8
2018-06-21 15:48



इससे आपको टाइमज़ोन और दूसरे परिणामस्वरूप डेट ऑब्जेक्ट को खोने का कारण बनता है। मुझे लगता है कि आप उन घटकों को फिर से जोड़ने के लिए अंत में कुछ अतिरिक्त कोड जोड़ सकते हैं। - Tim Tisdall
धन्यवाद, यह काफी अच्छा है और काम किया है। - Daniel Sokolowski
तीसरे रेगेक्स में पैरेन्थेसिस की आवश्यकता नहीं है: new Date("2016-02-17T00:05:01+0000".replace(/-/g,'/').replace('T',' ').replace(/\..*|\+.*/,"")) - steevee


मैं इसे ऑफ़सेट करने के लिए लाइब्रेरी का उपयोग कर समाप्त हुआ:

http://zetafleet.com/blog/javascript-dateparse-for-iso-8601

एक बार उस पुस्तकालय को शामिल करने के बाद, आप नई तारीख बनाने के लिए इस कोड का उपयोग करते हैं:

var date = new Date(Date.parse(datestring));

हमारी परियोजना मिलीसेकंड विनिर्देशों का उपयोग नहीं कर रही थी, लेकिन मुझे विश्वास नहीं है कि आपके लिए कोई समस्या होगी।


5
2017-09-13 21:18





मेरा इसी तरह का मुद्दा सफारी के कारण हुआ था कि आरएफसी 822 समय क्षेत्र प्रारूप में टाइमज़ोन को कैसे पढ़ा जाए। मैं आईएसओ 8601 प्रारूप का उपयोग करके इसे ठीक करने में सक्षम था। यदि आपके पास डेट प्रारूप का नियंत्रण है तो मुझे यह जावा के सिंपलडेटफॉर्मैट के साथ काम कर रहा है "yyyy-MM-dd'T'HH: mm: ss.sssXXX" जो मेरे लिए उत्पन्न करता है यानी। "2018-02-06T20: 00: 00.000 + 04: 00"। किसी भी कारण से सफारी "2018-02-06T20: 00: 00.000 + 0400" नहीं पढ़ सकता है, टाइमज़ोन प्रारूप में कोलन की कमी पर ध्यान दें।

// Works
var c = new Date("2018-02-06T20:00:00.000+04:00"));
console.log(c);

// Doesn't work
var c = new Date("2018-02-06T20:00:00.000+0400"));
console.log(c);

4
2018-03-06 19:21





मैं टाइमज़ोन के साथ पार्सिंग तिथियों के लिए निम्न फ़ंक्शन का उपयोग करता हूं। क्रोम और सफारी दोनों ठीक काम करता है:

function parseDate(date) {
  const parsed = Date.parse(date);
  if (!isNaN(parsed)) {
    return parsed;
  }

  return Date.parse(date.replace(/-/g, '/').replace(/[a-z]+/gi, ' '));
}

console.log(parseDate('2017-02-09T13:22:18+0300'));  // 1486635738000 time in ms


2
2018-02-10 03:47



यह करने का सबसे सुरक्षित तरीका है। मुझे लगता है कि आपको अंतिम प्रतिस्थापन को कुछ ऐसा बदलना चाहिए /[a-z]+/gi, व्यापक दर्शकों से मेल खाने के लिए, केवल टी के बजाय यूटीसी के साथ तिथियों की तरह। - Narayon
@ नारायण आपकी टिप्पणी के लिए धन्यवाद, मैंने जवाब बदल दिया है। - Londeren


मैंने इसे परिवर्तित करके तारीख को बदलने की कोशिश की और इसे इस तरह पार्स कर दिया, यह सफारी और आईओएस के साथ काम कर रहा है।

var dateString = "2016-01-22T08:18:10.000+0000";
 var hours = parseInt(dateString.split("+")[1].substr("0","2"));
 var mins = parseInt(dateString.split("+")[1].substr("2"));
 var date = new Date(dateString.split("+")[0]);
 date.setHours(date.getHours()-hours);
 date.setMinutes(date.getMinutes()-mins);

1
2018-01-27 05:07





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

let timezoneOffset = () => {
    let date = new Date(),
        timezoneOffset = date.getTimezoneOffset(),
        hours = ('00' + Math.floor(Math.abs(timezoneOffset/60))).slice(-2),
        minutes = ('00' + Math.abs(timezoneOffset%60)).slice(-2),
        string = (timezoneOffset >= 0 ? '-' : '+') + hours + ':' + minutes;
    return string;
}

तो अंतिम परिणाम होगा:

var c = new Date("2011-06-21T14:27:28.593" + timezoneOffset());


0
2018-04-27 19:55



सफारी में अमान्य तिथि ... - Mirko