सफारी में अमान्य दिनांक


155
 alert(new Date('2010-11-29'));

क्रोम, ff को इससे कोई समस्या नहीं है, लेकिन सफारी "अमान्य दिनांक" का रोना रोती है। क्यों ?

संपादित करें: ठीक है, नीचे दी गई टिप्पणियों के अनुसार, मैंने स्ट्रिंग पार्सिंग का उपयोग किया और यह कोशिश की:

alert(new Date('11-29-2010')); //doesn't work in safari
alert(new Date('29-11-2010')); //doesn't work in safari
alert(new Date('2010-29-11')); //doesn't work in safari

संपादित करें मार्च 22 2018 : लगता है जैसे लोग अभी भी यहां उतर रहे हैं - आज, मैं इसका उपयोग करूंगा momentया date-fnsइसके साथ रहूंगा। खजूर-फांस बहुत दर्द मुक्त और साथ ही हल्का है।


बस उसी समस्या को देखने वाले अन्य लोगों के लिए: मैंने DateJS का उपयोग करके समाप्त किया, जिसने मेरी समस्या को हल किया .. विवरण के लिए स्वीकृत उत्तर देखें।
श्रीनाथ

2
टाइमस्टैम्प को पार्स करने के लिए क्षण का उपयोग करें । विशेष रूप से जब क्रॉस प्लेटफॉर्म वेब के साथ काम कर रहे हैं
मिंग यूएन

1
यह एक पुराना सवाल है। ईसीएमएस्क्रिप्ट 2015 के अनुसार, आईएसओ 8601 तारीख-केवल तार को यूटीसी के रूप में पार्स किया जाता है। हालाँकि, अभी भी आसपास पुराने ब्राउज़र हो सकते हैं जो या तो इसे पार्स नहीं करेंगे या इसे स्थानीय मानेंगे।
रॉबग

जवाबों:


167

पैटर्न कंस्ट्रक्टर के yyyy-MM-ddलिए आधिकारिक रूप से समर्थित प्रारूप नहीं है Date। फ़ायरफ़ॉक्स इसे समर्थन करने के लिए लगता है, लेकिन ऐसा करने वाले अन्य ब्राउज़रों पर भरोसा न करें।

यहाँ कुछ समर्थित तार दिए गए हैं:

  • MM-dd-yyyy
  • yyyy / MM / dd
  • एम एम / dd / yyyy
  • MMMM dd, yyyy
  • MMM dd, yyyy

DateJS गैर मानक तिथि प्रारूपों को पार्स करने के लिए एक अच्छे पुस्तकालय की तरह लगता है।

संपादित करें : बस ECMA-262 मानक की जाँच की । धारा 15.9.1.15 से उद्धृत:

दिनांक समय स्ट्रिंग प्रारूप

ECMAScript आईएसओ 8601 विस्तारित प्रारूप के सरलीकरण के आधार पर तारीख-बार के लिए एक स्ट्रिंग इंटरचेंज प्रारूप को परिभाषित करता है। प्रारूप इस प्रकार है: YYYY-MM-DDTHH: मिमी: ss.sssZ जहाँ फ़ील्ड निम्नानुसार हैं:

  • YYYY ग्रेगोरियन कैलेंडर में वर्ष का दशमलव अंक है।
  • "-" (हाइफ़न) स्ट्रिंग में सचमुच दो बार दिखाई देता है।
  • MM वर्ष का महीना 01 (जनवरी) से 12 (दिसंबर) है।
  • डीडी महीने का दिन 01 से 31 तक है।
  • "टी" शाब्दिक रूप से स्ट्रिंग में दिखाई देता है, समय तत्व की शुरुआत को इंगित करने के लिए।
  • एचएच पूरे घंटे की संख्या है जो आधी रात के बाद से दो दशमलव अंकों के रूप में पारित हुआ है।
  • ":" (कोलन) स्ट्रिंग में सचमुच दो बार दिखाई देता है।
  • मिमी दो दशमलव अंकों के रूप में घंटे की शुरुआत के बाद से पूर्ण मिनटों की संख्या है।
  • ss दो दशमलव अंकों के रूप में मिनट की शुरुआत के बाद से पूर्ण सेकंड की संख्या है।
  • "।" (डॉट) सचमुच स्ट्रिंग में दिखाई देता है।
  • sss दूसरे दशमलव अंकों के रूप में दूसरे की शुरुआत से पूर्ण मिलीसेकंड की संख्या है। दोनों "।" और मिलीसेकंड फ़ील्ड छोड़ा जा सकता है।
  • Z टाइम ज़ोन ऑफसेट है जिसे "Z" (UTC के लिए) या "+" या "-" के रूप में निर्दिष्ट किया गया है और उसके बाद एक समय अभिव्यक्ति hm: mm

इस प्रारूप में केवल दिनांक के रूप शामिल हैं:

  • YYYY
  • YYYY-MM
  • YYYY-MM-DD

इसमें एक वैकल्पिक टाइम ज़ोन ऑफसेट के साथ समय-समय के फॉर्म भी शामिल हैं:

  • THH: मिमी
  • THH: mm: ss
  • THH: mm: ss.sss

इसमें "दिनांक-समय" भी शामिल है जो उपरोक्त में से कोई भी संयोजन हो सकता है।

तो, ऐसा लगता है कि YYYY-MM-DD मानक में शामिल है, लेकिन किसी कारण से, सफारी इसका समर्थन नहीं करता है।

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

var myDate1 = Date.parseExact("29-11-2010", "dd-MM-yyyy");
var myDate2 = Date.parseExact("11-29-2010", "MM-dd-yyyy");
var myDate3 = Date.parseExact("2010-11-29", "yyyy-MM-dd");
var myDate4 = Date.parseExact("2010-29-11", "yyyy-dd-MM");

4
ISO8601 प्रारूप का उपयोग ECMAScript मानक के 5 वें संस्करण में किया जाता है, और अभी तक व्यापक रूप से समर्थित नहीं है, IMO जाने के लिए सबसे सुरक्षित तरीका, तिथि मैन्युअल रूप से पार्स करें :(
CMS

1
यह बहुत उपयोगी दोस्त था .. धन्यवाद .. :) आखिरकार स्वरूपण के लिए डेटज का उपयोग करके समाप्त हो गया।
श्रीनाथ 12

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

@darioo तो मैंने आपके उत्तर का अनुसरण करने की कोशिश की: "var start = Date.parseExact (टाइमस्टैम्प," YYYY-DD-MM HH: mm: SS ");" टाइमस्टैम्प "2016-01-28 00:00:00" है। हालाँकि अब मुझे यह त्रुटि मिली, कि "Date.parseExact एक फ़ंक्शन नहीं है"। जानते हो, यहां क्या हो रहा है?
threxx

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

224

मेरे लिए एक नया पुस्तकालय लागू करना सिर्फ इसलिए कि सफारी इसे सही ढंग से नहीं कर सकता है और एक रेग्क्स ओवरकिल है। यहाँ oneliner है :

console.log (new Date('2011-04-12'.replace(/-/g, "/")));

यदि स्लैश प्राप्त करना केवल मेरी समस्या थी, तो मैं आपके उत्तर को 'स्वीकार' कर लेता (हालाँकि यह मेरा एकमात्र उद्देश्य था जब मैंने यह प्रश्न पूछा था)। अब जब मुझे dateJS मिला, तो मैंने अधिक उपयोगकर्ता के अनुकूल अनुभव के लिए MMM DD, YYYY प्रारूप लागू किया !!!
श्रीनाथ

13
यह एक लाइन मदद मेरी जरूरत के लिए एकदम सही थी! धन्यवाद!
सिरिल एन।

4
यह मेरे लिए काफी सरल था। विश्वास नहीं कर सकता कि सफारी को पसंद नहीं है - लेकिन \\ के काम के साथ एक ही प्रारूप धन्यवाद @Elzo और धन्यवाद श्रीनाथ सवाल पोस्ट करने के लिए
पीट

1
मुझे लगता है कि यह सबसे अच्छा जवाब है जिसे मैं भूल जाता हूं / - / g के बजाय '-'
Jacek Pietal

12
पुस्तकालय को लागू नहीं करने के लिए तालियाँ
lharby

56

मैं इसी तरह के मुद्दे का सामना कर रहा था। Date.Parse("DATESTRING")क्रोम पर काम कर रहा था (संस्करण 59.0.3071.115) लेकिन सफारी का नहीं (संस्करण 10.1.1 (11603.2.5))

सफारी:

Date.parse("2017-01-22 11:57:00")
NaN

क्रोम:

Date.parse("2017-01-22 11:57:00")
1485115020000

मेरे लिए काम करने वाला समाधान डेटस्ट्रिंग में जगह की जगह ले रहा था "T"। (उदाहरण: dateString.replace(/ /g,"T"))

सफारी:

Date.parse("2017-01-22T11:57:00")
1485086220000

क्रोम:

Date.parse("2017-01-22T11:57:00")
1485115020000

ध्यान दें कि Chrome ब्राउज़र में देखी गई प्रतिक्रिया की तुलना में Safari ब्राउज़र की प्रतिक्रिया 8hrs (28800000ms) से कम है क्योंकि Safari ने स्थानीय TZ (जो कि UTC के पीछे 8hrs है) में प्रतिक्रिया लौटा दी है

एक ही TZ में दोनों समय प्राप्त करने के लिए

सफारी:

Date.parse("2017-01-22T11:57:00Z")
1485086220000

क्रोम:

Date.parse("2017-01-22T11:57:00Z")
1485086220000

या यदि आप सफारी और क्रोम में समान होने के लिए दोनों तिथियों नहीं चाहते हैं तो आप new Date(year, month, date, hours, minutes, seconds, milliseconds)कंस्ट्रक्टर का उपयोग कर सकते हैं । निर्माण में उन घटकों का उपयोग करने के लिए अपने घटकों की एक सरणी के लिए स्ट्रिंग दिनांक पार्स करें। @nizantz यह बहुत अच्छा होगा यदि आपको लगता है कि इस तरह के उदाहरण को आपके उत्तर में जोड़ा जा सकता है।
h3dkandi

UTC में तारीख पाने के बाद से विशेष रूप से उपयोगी नहीं है और न ही स्थानीय समय।
जोनास Jonppelgran

1
dateString.replace(/ /g,"T")कोड की इस जादुई रेखा ने मुझे काम दिया। :)
मजदाक शोजाई

प्रतिस्थापित करें (/ - / g, '/')
जैक हू

11

मैं समस्या को हल करने के लिए पल का उपयोग करता हूं उदाहरण के लिए

var startDate = moment('2015-07-06 08:00', 'YYYY-MM-DD HH:mm').toDate();

10

अधिकांश ब्राउज़रों पर काम करने के लिए एक समाधान है, आपको इस प्रारूप के साथ अपनी दिनांक-ऑब्जेक्ट बनाना चाहिए

(year, month, date, hours, minutes, seconds, ms)

उदाहरण के लिए:

dateObj = new Date(2014, 6, 25); //UTC time / Months are mapped from 0 to 11
alert(dateObj.getTime()); //gives back timestamp in ms

IE, FF, क्रोम और सफारी के साथ ठीक काम करता है। पुराने संस्करण भी।

IE देव केंद्र: दिनांक वस्तु (जावास्क्रिप्ट)

मोज़िला देव नेटवर्क: दिनांक


6

स्ट्रिंग को डेट से बदलें (आपको सर्वर टाइमज़ोन जानना होगा)

new Date('2015-06-16 11:00:00'.replace(/\s+/g, 'T').concat('.000+08:00')).getTime()  

जहां सर्वर से +08: 00 = टाइमजोन


यह डीएसटी को ध्यान में नहीं रखता है। TZ ऑफसेट में उतार-चढ़ाव हो सकता है और यह तारीख (और समय) पर निर्भर करता है।
कोस्टा

5

मेरे पास एक ही मुद्दा था। फिर मैंने क्षण का उपयोग किया। जेएस .प्रोब्लम गायब हो गया है।

एक स्ट्रिंग से एक क्षण बनाते समय, हम पहले जांचते हैं कि क्या स्ट्रिंग आईएसओ 8601 प्रारूपों से मेल खाता है, तो एक ज्ञात प्रारूप नहीं मिलने पर वापस नई तिथि (स्ट्रिंग) पर गिर जाते हैं।

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

आईएसओ 8601 स्ट्रिंग्स के अलावा किसी भी चीज़ को पार्स करने के लगातार परिणामों के लिए, आपको स्ट्रिंग + फॉर्मेट का उपयोग करना चाहिए।

जैसे

var date= moment(String);

3

हालाँकि आप उम्मीद कर सकते हैं कि ब्राउज़र आईएसओ 8601 (या उसके बाद के सब-सब्मिट) का समर्थन करेंगे , लेकिन ऐसा नहीं है। वे सभी ब्राउज़र जिन्हें मैं जानता हूं (कम से कम अमेरिका / अंग्रेजी स्थानों पर मैं उपयोग करता हूं) भयानक अमेरिकी MM/DD/YYYYप्रारूप को पार्स करने में सक्षम हैं ।

यदि आपके पास पहले से ही तारीख के हिस्से हैं, तो आप इसके बजाय Date.UTC () का उपयोग करने का प्रयास कर सकते हैं । यदि आप नहीं करते हैं, लेकिन आपको YYYY-MM-DDप्रारूप का उपयोग करना चाहिए , तो मैं सुझाव देता हूं कि आपके द्वारा ज्ञात टुकड़ों को पार्स करने के लिए एक नियमित अभिव्यक्ति का उपयोग करें और फिर उन्हें पास करें Date.UTC()


मुझे लगता है कि स्ट्रिंग पार्सिंग जाने का रास्ता है :(
श्रीनाथ

1

नीचे दिए गए प्रारूप का उपयोग करें, यह सभी ब्राउज़रों पर काम करेगा

var year = 2016;
var month = 02;           // month varies from 0-11 (Jan-Dec)
var day = 23;

month = month<10?"0"+month:month;        // to ensure YYYY-MM-DD format
day = day<10?"0"+day:day;

dateObj = new Date(year+"-"+month+"-"+day);

alert(dateObj); 

// आपका आउटपुट इस तरह दिखाई देगा "बुध मार्च 23 2016 00:00:00 GMT + 0530 (IST)"

// ध्यान दें कि यह वर्तमान समयक्षेत्र में होगा इस मामले में IST द्वारा निरूपित, यूटीसी समयक्षेत्र में परिवर्तित करने के लिए जिसे आप शामिल कर सकते हैं

alert(dateObj.toUTCSting);

// आपका आउटपुट अब यह पसंद करेगा "मंगल, 22 मार्च 2016 18:30:00 GMT"

ध्यान दें कि अब dateObj GMT प्रारूप में समय दिखाता है, यह भी ध्यान दें कि तारीख और समय को समान रूप से बदल दिया गया है।

"टॉसकटिंग" फ़ंक्शन ग्रीनविच मेरिडियन पर संबंधित समय को पुनः प्राप्त करता है। यह आपके वर्तमान समयक्षेत्र के बीच अंतर को ग्रीनविच मेरिडियन टाइमज़ोन में स्थापित करके पूरा करता है।

उपरोक्त मामले में वर्ष 2016 में 23 मार्च को रूपांतरण से पहले का समय 00:00 घंटे और मिनट था। और GMT + 0530 (IST) घंटे से GMT में रूपांतरण के बाद (यह मूल रूप से दिए गए टाइमस्टैम्प से 5.30 घंटे घटाता है। मामला) वर्ष २०१६ में २२ मार्च को समय १ ).३० घंटे को दर्शाता है (पहली बार ठीक ५.३० घंटे)।

आगे किसी भी समय ऑब्जेक्ट को टाइमस्टैम्प में बदलने के लिए जिसका आप उपयोग कर सकते हैं

alert(dateObj.getTime());

// आउटपुट "1458671400000" के समान होगा।

यह आपको समय का अनूठा टाइमस्टैम्प प्रदान करेगा



1

निम्नलिखित प्रारूप का उपयोग करके इसे करने का सबसे अच्छा तरीका है:

new Date(year, month, day, hours, minutes, seconds, milliseconds)
var d = new Date(2018, 11, 24, 10, 33, 30, 0);

यह सभी ब्राउज़रों में समर्थित है और आपको कोई समस्या नहीं देगा। कृपया ध्यान दें कि महीने 0 से 11 तक लिखे गए हैं।


सफारी और क्रोम पर अच्छी तरह से काम करता है, लेकिन अभी भी फ़ायरफ़ॉक्स पर मुद्दे हैं। सफ़ारी: var date = new Date (2018,06,08,19,17) Sun Jul 08 2018 19:17:00 GMT + 0800 (+08) क्रोम: var date = नई तारीख (2018,06,08,19,) 17) सूर्य जुलाई 08 2018 19:17:00 GMT + 0800 (मलेशिया का समय) फ़ायरफ़ॉक्स: var तिथि = नई तिथि (2018,06,08,19,17) दिनांक 2018-07-08T11: 17: 00.000Z
बिरंची

0

सफारी में भी यही समस्या है और इसे वेब पेज में डाला गया है

 <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script> 

आशा है कि यह आपके मामले में भी काम करेगा

धन्यवाद


आपको क्यों लगता है कि यह काम करेगा? मैंने स्क्रिप्ट को देखा और यह दिनांक ऑब्जेक्ट में विधियों को ओवरराइड करने के लिए प्रतीत नहीं होता है। मैं यहां गया था: polyfill.io/v3/url-builder और लगता है कि पार्सिंग डेट के बारे में कुछ भी नहीं है।
कोस्टा

0

जैसा कि @nizantz ने पहले उल्लेख किया था, Date.parse () सफारी में मेरे लिए काम नहीं कर रहा था। थोड़ी खोजबीन के बाद, मुझे पता चला कि फ़ाइल ऑब्जेक्ट के लिए LastDateModified संपत्ति को हटा दिया गया है, और अब Safari द्वारा समर्थित नहीं है। फ़ाइल ऑब्जेक्ट के lastModified संपत्ति का उपयोग करके मेरे मुद्दों को हल किया। खराब जानकारी ऑनलाइन मिलने पर इसे ज़रूर नापसंद करें।

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


0

मैं भी सफारी ब्राउज़र में एक ही समस्या का सामना कर रहा हूँ

var date = new Date("2011-02-07");
console.log(date) // IE you get ‘NaN’ returned and in Safari you get ‘Invalid Date’

यहाँ समाधान है:

var d = new Date(2011, 01, 07); // yyyy, mm-1, dd  
var d = new Date(2011, 01, 07, 11, 05, 00); // yyyy, mm-1, dd, hh, mm, ss  
var d = new Date("02/07/2011"); // "mm/dd/yyyy"  
var d = new Date("02/07/2011 11:05:00"); // "mm/dd/yyyy hh:mm:ss"  
var d = new Date(1297076700000); // milliseconds  
var d = new Date("Mon Feb 07 2011 11:05:00 GMT"); // ""Day Mon dd yyyy hh:mm:ss GMT/UTC 

0

यह सबसे अच्छा समाधान नहीं है, हालांकि मैं बस त्रुटि को पकड़ता हूं और वर्तमान तिथि वापस भेजता हूं। मैं व्यक्तिगत रूप से सफारी के मुद्दों को हल नहीं करने की तरह महसूस करता हूं, अगर उपयोगकर्ता श * टी गैर-मानकों के अनुरूप ब्राउज़र का उपयोग करना चाहते हैं - तो उन्हें quirks के साथ रहना होगा।

function safeDate(dateString = "") {
  let date = new Date();
  try {
    if (Date.parse(dateString)) {
      date = new Date(Date.parse(dateString))
    }
  } catch (error) {
    // do nothing.
  }
  return date;
}

मेरा सुझाव है कि आपका बैकएंड आईएसओ तारीखें भेजें।


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

-1

'mm / dd / yyyy' प्रारूप का उपयोग करें। उदाहरण के लिए: - नई तिथि ('02 / 28/2015 ')। यह सभी ब्राउज़रों में अच्छा काम करता है।

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