जावास्क्रिप्ट में "अमान्य दिनांक" दिनांक उदाहरण का पता लगाना


1492

मैं JS में मान्य और अमान्य दिनांक ऑब्जेक्ट के बीच का अंतर बताना चाहूंगा, लेकिन यह पता नहीं लगा सका:

var d = new Date("foo");
console.log(d.toString()); // shows 'Invalid Date'
console.log(typeof d); // shows 'object'
console.log(d instanceof Date); // shows 'true'

एक isValidDateसमारोह लिखने के लिए कोई विचार ?

  • Date.parseतिथि स्ट्रिंग को पार्स करने के लिए ऐश की सिफारिश की गई है , जो यह जांचने के लिए एक आधिकारिक तरीका देता है कि क्या तारीख स्ट्रिंग वैध है।
  • यदि संभव हो तो मैं क्या पसंद करूंगा, क्या मेरा एपीआई एक तिथि उदाहरण स्वीकार करता है और यह जाँचने / सक्षम करने में सक्षम है कि क्या यह वैध है या नहीं। Borgar का समाधान यह करता है, लेकिन मुझे इसे ब्राउज़रों में जांचने की आवश्यकता है। मुझे यह भी आश्चर्य है कि क्या कोई अधिक सुरुचिपूर्ण तरीका है।
  • ऐश ने मुझे इस बात पर विचार करने के Dateलिए प्रेरित किया कि मेरे एपीआई को बिल्कुल भी स्वीकार नहीं करना चाहिए, यह आसान होगा।
  • Borgar ने एक Dateउदाहरण के लिए परीक्षण का सुझाव दिया , और फिर Dateसमय मान के लिए परीक्षण किया । यदि दिनांक अमान्य है, तो समय मान है NaN। मैंने ECMA-262 के साथ जांच की और यह व्यवहार मानक में है, जो कि वास्तव में मैं देख रहा हूं।

18
यदि आप फ़ंक्शन की बॉडी को बदलकर स्टेटमेंट को हटा सकते हैं:return ( Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d.getTime()) );
स्टाइल

3
@styfle - लगता है कि यह एक शैली वरीयता है: मुझे समानता तर्क से प्रकार की जांच को अलग करने के लिए स्पष्ट है।
orip

26
@orip प्रवचन वही है जो सवालों में भारी है। कृपया इसके पीछे तर्क जानने के लिए प्रासंगिक मेटा विषयों का संदर्भ लें। प्रश्न में स्वयं प्रश्न का उत्तर देना साइट नीति के विरुद्ध है। OTOH, प्रतिक्रियाओं के लिए धन्यवाद और आपके उत्तर में "EDIT" है विशिष्ट फुलाना। यदि आप चाहते हैं कि आप टॉप रेटेड सवाल करें तो आपको एक ऐसे व्यक्ति के रूप में पहचाना जाएगा जो यह नहीं जानता कि एसओ क्या है और इसका उपयोग कैसे करना है, और यह जानने की इच्छा नहीं है कि - मेरे मेहमान बनें।

14
@orip: यह "खो" नहीं था; यदि आप इसे फिर से देखना चाहते हैं, तो यह अभी भी प्रश्न के संशोधन इतिहास को उलट रहा है। लेकिन यह एक सवाल में नहीं है। 37k प्रतिनिधि पर आपको यह जानना चाहिए।
ऑर्बिट

6
कृपया संपादन युद्ध रोकें। इस प्रश्न के संपादन पर मेटा में चर्चा की गई है । कृपया इस पोस्ट को आगे संपादित / रोलबैक न करें। यदि आप पिछले संपादन / रोलबैक से असहमत हैं या उनके बारे में कोई टिप्पणी है, तो कृपया उस मेटा थ्रेड पर पोस्ट करें और यहाँ नहीं।
लंडिन

जवाबों:


1301

यहां बताया गया है कि मैं यह कैसे करूंगा:

if (Object.prototype.toString.call(d) === "[object Date]") {
  // it is a date
  if (isNaN(d.getTime())) {  // d.valueOf() could also work
    // date is not valid
  } else {
    // date is valid
  }
} else {
  // not a date
}

अपडेट [२०१ not-०५-३१] : यदि आप अन्य जेएस संदर्भों (बाहरी विंडो, फ्रेम, या आईफ्रेम) से डेट ऑब्जेक्ट से चिंतित नहीं हैं, तो यह सरल रूप पसंद किया जा सकता है:

function isValidDate(d) {
  return d instanceof Date && !isNaN(d);
}

21
instof तख्ते को तोड़ता है। बत्तख-टाइपिंग ठीक काम कर सकती है: मान्य == d && d.getTime &&! IsNaN (d.getTime ()); - चूंकि प्रश्न एक सामान्य उपयोगिता फ़ंक्शन के लिए है, इसलिए मैं अधिक सख्त होना पसंद करता हूं।
बोरगर

11
@ बोरगर, बस मेरा जवाब मिला: "जब मल्टी-फ्रेम डोम वातावरण में स्क्रिप्टिंग की समस्या आती है, तो संक्षेप में, एक iframe के भीतर बनाई गई ऐरे ऑब्जेक्ट्स साझा नहीं करते हैं [[प्रोटोटाइप]] एक अन्य iframe के भीतर सरणियों के साथ। । उनके निर्माता अलग-अलग ऑब्जेक्ट हैं और इसलिए इंस्टोफ़ और कंस्ट्रक्टर चेक दोनों विफल होते हैं। "
ऐश

64
तुम भी जरूरत नहीं है d.getTimeबसisNan(d)
TecHunter

8
इसे इस तरह सरल बनाया जा सकता है:d instanceof Date && !isNaN(d.getTime())
जोरगटोन

5
उत्तर के लिए धन्यवाद, लेकिन मैं @Borgar और @blueprintChris टिप्पणियों पर जोर देना चाहता हूं: यदि मैं 1उदाहरण के लिए अंक को पार्स करता हूं तो मेरे पास अभी भी एक वैध तारीख होगी जिसके परिणामस्वरूप Mon Jan 01 2001 00:00:00वास्तव में एक तारीख है, हालांकि मेरे आवेदन के उद्देश्य के लिए यह पूरी तरह से बेकार है । इस प्रकार, कम से कम मेरे मामले में कुछ और इनपुट सत्यापन की आवश्यकता है। यह उत्तर मान्य dateObjectनहीं है Date!
dnipper

264

उपयोग करने के बजाय new Date()आपको उपयोग करना चाहिए:

var timestamp = Date.parse('foo');

if (isNaN(timestamp) == false) {
  var d = new Date(timestamp);
}

Date.parse()एक टाइमस्टैम्प लौटाता है, एक पूर्णांक 01 / जनवरी / 1970 से मिलीसेकंड की संख्या का प्रतिनिधित्व करता है। NaNयदि यह आपूर्ति की गई तारीख स्ट्रिंग को पार्स नहीं कर सकता है तो यह वापस आ जाएगा ।


119
-1 डन्नो के पास इतने सारे वोट क्यों हैं, Date.parseयह निर्भरता को लागू करने वाला है और निश्चित रूप से सामान्य तिथि के तार को पार्स करने के लिए भरोसेमंद नहीं है। कोई भी ऐसा प्रारूप नहीं है जो लोकप्रिय ब्राउज़रों में सही ढंग से दर्ज किया गया हो, जो उपयोग में आने वाले सभी लोगों से बहुत कम है (हालांकि अंततः ES501 में निर्दिष्ट ISO8601 प्रारूप ठीक होना चाहिए)।
रॉब

1
यदि आप new Date('foo')मूल रूप से Date.parse('foo')विधि के साथ इसका उपयोग करते हैं। देखें: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… तो @RobG ने जो कहा, वह उस पर भी लागू होता है।
Golddragon007

2
यह परीक्षण Chrome में विफल हो जाएगा। उदाहरण के लिए, Chrome में Date.parse ('AAA-0001') मुझे एक नंबर देता है।
निक

विफल ... सभी संख्यात्मक मूल्यों का पता लगाएं
बुध बुध

109

तुम एक की वैधता की जांच कर सकते हैं Dateवस्तु dके माध्यम से

d instanceof Date && isFinite(d)

क्रॉस-फ़्रेम के मुद्दों से बचने के लिए, व्यक्ति instanceofचेक को बदल सकता है

Object.prototype.toString.call(d) === '[object Date]'

बोर्गार के उत्तरgetTime() में कॉल के रूप में अनावश्यक है और दोनों अनुमानित संख्या में परिवर्तित होते हैं।isNaN()isFinite()


क्रोम में इस कोशिश करें - Object.prototype.toString.call (नई तिथि ("2013-07-09T19: 07: 9Z")। यह "[वस्तु दिनांक]" लौटाएगा। आपके अनुसार, इसलिए, "2013-07-09T19: 07: 9Z", एक वैध तिथि होनी चाहिए। लेकिन यह नहीं है। आप इसे पुनः सत्यापित कर सकते हैं, फिर से क्रोम में, var dateStr = new Date ("2013-07-09T19: 07: 9Z;)" करके; dateStr यह अमान्य दिनांक लौटाएगा।
टिनटिन

2
@Tintin: कि क्या के isFinite()लिए है - toString.call()केवल के लिए एक स्थानापन्न है instanceofजांच का हिस्सा
क्रिस्टोफ

गैर-अंग्रेजी ब्राउज़रों के साथ '[वस्तु दिनांक]' के साथ तुलना करेंगे? मुझे शक है।
kristianp

2
@kristianp वास्तव में यह शायद है और शायद भी ECMAScript कल्पना का हिस्सा है। लेकिन, हाँ, यह बदसूरत लगता है।
बिंकी

मेरे लिए यहाँ पहला तरीका बहुत ही अच्छा विकल्प है, हालाँकि मुझे यकीन नहीं है कि अगर कोई वास्तविक दुनिया में उपयोग isFiniteकरने का लाभ उठाता है isNaN(दोनों ही काम ठीक है Date(Infinity))। इसके अलावा, यदि आप विपरीत स्थिति चाहते हैं, तो यह थोड़ा सरल हो जाता है if (!(date instanceof Date) || isNaN(date)):।
एंड्रयू

86

मेरा समाधान केवल यह जाँचने के लिए है कि क्या आपको एक वैध दिनांक वस्तु मिलती है:

कार्यान्वयन

Date.prototype.isValid = function () {
    // An invalid date object returns NaN for getTime() and NaN is the only
    // object not strictly equal to itself.
    return this.getTime() === this.getTime();
};  

प्रयोग

var d = new Date("lol");

console.log(d.isValid()); // false

d = new Date("2012/09/11");

console.log(d.isValid()); // true

28
isNaNNaN के लिए परीक्षण करने का एक और अधिक स्पष्ट तरीका है
orip

1
और फिर भी, आप हमेशा अपने स्वयं के संस्करण लिखने वाले लोगों को पाते हैं :) documentcloud.github.com/underscore/docs/…
ऐश क्लार्क

4
चूँकि मैं अंडरस्कोर का सम्मान करता हूं। जेएस ने कुछ शोध को प्रेरित किया। isNaN("a") === true, जबकि ("a" !== "a") === false। यह सोचने लायक है। +1
9

8
मैंने यहां पाए गए 3 मुख्य समाधानों के प्रदर्शन का परीक्षण किया। बधाई हो, आप विजेता हैं! jsperf.com/detecting-an-invalid-date
zVictor

2
@ कोई मान्य दिनांक ऑब्जेक्ट है। new Date("02-31-2000") // Thu Mar 02 2000 00:00:00 GMT+0000 (GMT Standard Time)। यदि आप स्ट्रिंग को डेट कंस्ट्रक्टर में पास कर रहे हैं, तो आपको एक विश्वसनीय परिणाम प्राप्त करने के लिए एक मानकीकृत स्ट्रिंग में पास होना चाहिए। विशेष रूप से, "स्ट्रिंग Date.parse () विधि द्वारा मान्यता प्राप्त एक प्रारूप में होना चाहिए"। developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
ऐश क्लार्क

71

मान्य तिथि जाँचने के लिए सबसे छोटा उत्तर

if(!isNaN(date.getTime()))

2
एकमात्र समस्या यह है कि यदि तारीख प्रकार की नहीं है; आपको JS त्रुटि मिलती है।
एंड्रयू

@ और आपको दिनांक ऑब्जेक्ट बनाने की आवश्यकता है और यदि आपके पास पहले से कोई ऑब्जेक्ट है तो उपयोग करेंdate && !isNaN(date.getTime())
abhirathore2006

यदि आप dateतारीख की नहीं है, तब भी आपको एक जेएस त्रुटि देता है। उदाहरण के लिए var date = 4; date && !isNaN(date.getTime());:।
एंड्रयू

@ और उपयोग date instanceof Date && !isNaN(date.getTime())
abhirathore2006

3
ठीक, 8 साल पहले के अन्य उत्तरों की तरह। : P stackoverflow.com/a/1353945/2321042
एंड्रयू

45

आप बस moment.js का उपयोग कर सकते हैं

यहाँ एक उदाहरण है:

var m = moment('2015-11-32', 'YYYY-MM-DD');
m.isValid(); // false

सत्यापन अनुभाग दस्तावेज में काफी स्पष्ट है।

और भी, निम्न पार्सिंग झंडे का परिणाम अमान्य दिनांक:

  • overflow: दिनांक फ़ील्ड का एक अतिप्रवाह, जैसे कि 13 वां महीना, महीने का 32 वां दिन (या गैर-लीप वर्ष पर फरवरी का 29 वां दिन), वर्ष का 367 वां दिन, आदि अतिप्रवाह में अमान्य इकाई का सूचकांक होता है। #invalidAt से मेल खाने के लिए (नीचे देखें); -1 का मतलब ओवरफ्लो नहीं।
  • invalidMonth: एक अमान्य महीने का नाम, जैसे कि क्षण ('मार्बडे', 'एमएमएमएम'); अमान्य माह स्ट्रिंग को स्वयं शामिल करता है, या अन्यथा शून्य।
  • empty: एक इनपुट स्ट्रिंग जिसमें कुछ भी शामिल नहीं है, जैसे कि पल ('यह बकवास है');) बूलियन।
  • आदि।

स्रोत: http://momentjs.com/docs/


6
सबसे अच्छा समाधान, जिसे लागू करना बेहद आसान है, किसी भी प्रारूपण के साथ काम करता है (मेरा मामला dd / MM / yyyy है), लीप वर्ष भी जानता है और अमान्य तिथियों (अर्थात 29/02/2015) को स्वयं के द्वारा वैध में परिवर्तित नहीं करता है (अर्थात 30/03/2015)। फॉर्मड dd / MM / yyyy में एक तारीख की जाँच करने के लिए मुझे अभी उपयोग करना हैmoment("11/06/1986", "DD/MM/YYYY").isValid();
राफेल मर्लिन

3
मोमेंट के इस उपयोग को पदावनत कर दिया गया है :(
जेम्स सुमर्स

2
इस उपयोग को ह्रास नहीं किया गया है। एक प्रारूप स्ट्रिंग के बिना कॉलिंग पल (इनपुट) को ह्रासमान किया जाता है (जब तक कि इनपुट आईएसओ स्वरूपित न हो)।
चेत

2
कई तिथियों को संसाधित करते समय यह विधि बेहद धीमी हो सकती है। उन मामलों में रेगेक्स का उपयोग करना बेहतर है।
ग्रिड ट्रेकोर

2
क्षण का उपयोग। js सरल हो सकता है, लेकिन एक बहुत बड़ा ओवरहेड है। यह लाइब्रेरी बहुत बड़ी है। मैंने आपके उत्तर को अस्वीकार कर दिया।
मिक

38

उल्लेख करना चाहते हैं कि jQuery UI DatePicker विजेट में एक बहुत अच्छी तारीख सत्यापनकर्ता उपयोगिता विधि है जो प्रारूप और वैधता की जांच करती है (उदाहरण के लिए, कोई 01/33/2013 दिनांक अनुमत)।

यहां तक ​​कि अगर आप यूआई तत्व के रूप में अपने पेज पर डेटकपर विजेट का उपयोग नहीं करना चाहते हैं, तो आप हमेशा अपने .js लाइब्रेरी को अपने पेज में जोड़ सकते हैं और फिर सत्यापनकर्ता विधि को कॉल कर सकते हैं, उस मूल्य को पास कर सकते हैं जिसे आप मान्य करना चाहते हैं। जीवन को और भी आसान बनाने के लिए, यह इनपुट के रूप में एक स्ट्रिंग लेता है, जावास्क्रिप्ट तिथि वस्तु नहीं।

देखें: http://api.jqueryui.com/datepicker/

यह एक विधि के रूप में सूचीबद्ध नहीं है, लेकिन यह एक है - एक उपयोगिता समारोह के रूप में। "पार्सडेट" के लिए पृष्ठ खोजें और आप पाएंगे:

$ .datepicker.parseDate (प्रारूप, मूल्य, सेटिंग्स) - एक निर्दिष्ट प्रारूप के साथ एक स्ट्रिंग मान से दिनांक निकालें।

उदाहरण उपयोग:

var stringval = '01/03/2012';
var testdate;

try {
  testdate = $.datepicker.parseDate('mm/dd/yy', stringval);
             // Notice 'yy' indicates a 4-digit year value
} catch (e)
{
 alert(stringval + ' is not valid.  Format must be MM/DD/YYYY ' +
       'and the date value must be valid for the calendar.';
}

(अधिक जानकारी पुनः निर्दिष्ट करने की तिथि प्रारूप http://api.jqueryui.com/datepicker/#utility-sseDate पर पाया जाता है )

उपरोक्त उदाहरण में, आपको चेतावनी संदेश नहीं दिखाई देगा क्योंकि '01 / 03/2012 'निर्दिष्ट प्रारूप में एक कैलेंडर-मान्य तारीख है। हालाँकि, यदि आपने 'स्ट्रिंग' को '13 / 04/2013 'के बराबर बनाया है, उदाहरण के लिए, आपको अलर्ट संदेश मिलेगा, क्योंकि '13 / 04/2013' कैलेंडर-मान्य नहीं है।

यदि कोई पास-इन स्ट्रिंग मान सफलतापूर्वक पार्स किया गया है, तो 'testdate' का मान एक जावास्क्रिप्ट तिथि होगा जो पास-किए गए स्ट्रिंग मान का प्रतिनिधित्व करता है। यदि नहीं, तो यह अपरिभाषित होगा।


3
गैर अंग्रेजी / स्थानीय तारीख प्रारूपों के साथ काम करने वाले पहले उत्तर के लिए अपवोट।
कुल्हाड़ी।

26

मैं वास्तव में क्रिस्टोफ़ के दृष्टिकोण को पसंद करता था (लेकिन इसे वोट देने के लिए प्रतिष्ठा नहीं थी)। मेरे उपयोग के लिए, मुझे पता है कि मेरे पास हमेशा एक दिनांक वस्तु होगी इसलिए मैंने एक मान्य () पद्धति के साथ तारीख को बढ़ाया।

Date.prototype.valid = function() {
  return isFinite(this);
}

अब मैं बस यह लिख सकता हूं और यह कोड में केवल जाँच के मुकाबले बहुत अधिक वर्णनात्मक है ...

d = new Date(userDate);
if (d.valid()) { /* do stuff */ }

10
प्रोटोटाइप का विस्तार? यह एक बड़ा जावास्क्रिप्ट है नहीं नहीं!
जसदीप खालसा

isFiniteमेरे लिए पूरी तरह से काम करने के कारण अपवोटिंग । लेकिन हाँ, प्रोटोटाइप का विस्तार करने के लिए व्यर्थ। !isFiniteएक पर Dateतथ्य यह है कि पकड़ेगा Dateहै Invalid Date। यह भी ध्यान देने योग्य है कि मेरा संदर्भ नोड के अंदर है।
स्टैगहाउस

23
// check whether date is valid
var t = new Date('2011-07-07T11:20:00.000+00:00x');
valid = !isNaN(t.valueOf());

5
यह वही है @Borgar ने 2 साल पहले लिखा था ... नया क्या है ??
नीलेश

11
बयानों की मानें तो यह बदसूरत नेस्टेड के बजाय दो लाइनें हैं।
साइफ्रे

17

आप इस प्रारूप के साथ txDate.value के मान्य प्रारूप की जांच कर सकते हैं। यदि यह गलत प्रारूप में था, तो दिनांक को स्थगित नहीं किया गया था और dt को वापस लौटा दिया गया था।

 var dt = new Date(txtDate.value)
 if (isNaN(dt))

और जैसा कि @ MiF ने संक्षेप में सुझाया है

 if(isNaN(new Date(...)))

isNaN (नई तिथि (...)) - सरल और संक्षिप्त विधि
MiF

1
) धन्यवाद; @MiF हाँ, मैं अपने जवाब अपने सुझाव के साथ अद्यतन
Yuseferi

16

मैं वर्ष, माह और दिनांक के लिए मानों को मान्य करने के लिए निम्न कोड का उपयोग करता हूं।

function createDate(year, month, _date) {
  var d = new Date(year, month, _date);
  if (d.getFullYear() != year 
    || d.getMonth() != month
    || d.getDate() != _date) {
    throw "invalid date";
  }
  return d;
}

विवरण के लिए, जावास्क्रिप्ट में चेक की तारीख देखें


strउपयोग नहीं किया जा रहा है।
Samis

12

यहाँ पहले से ही बहुत से जटिल उत्तर हैं, लेकिन एक सरल रेखा पर्याप्त है (ES5):

Date.prototype.isValid = function (d) { return !isNaN(Date.parse(d)) } ;

या यहां तक ​​कि ES6 में:

Date.prototype.isValid = d => !isNaN(Date.parse(d));

1
MDN से: "Date.parse () विधि एक तारीख का एक स्ट्रिंग प्रतिनिधित्व पार्स करती है, और 1 जनवरी, 1970, 00:00:00 UTC या NaN के बाद से मिलीसेकंड की संख्या लौटाती है ..." इसलिए इसके माध्यम से संभावित तिथि चल रही है। फ़ंक्शन एक पूर्णांक या NaN देता है। फिर isNaN () फ़ंक्शन आपको एक क्लीन बूलियन देगा जो आपको बताएगा कि मूल मान एक मान्य दिनांक ऑब्जेक्ट था या नहीं। यह स्पॉट चेक बनाने के लिए पर्याप्त है, लेकिन ऊपर दिया गया उदाहरण इस विधि को आपके प्रोग्राम में आसानी से उपलब्ध और पठनीय बनाने के लिए डेट ऑब्जेक्ट को संलग्न करता है।
मैक्स वाइल्डर

अगर d बूलियन है तो आपको 0 या 1 प्राप्त होगा जो कि एक नान नहीं है !!
दवार्च

@davcup का उपयोग करके परीक्षण किया गया Date.parse(true), मुझे सही ढंग से NaN मिला।
सेबेस्टियन एच।

12

मैंने कुछ जवाब देखे जो इस छोटी सी झलकी के करीब आए थे।

जावास्क्रिप्ट तरीका:

function isValidDate(dateObject){ return new Date(dateObject).toString() !== 'Invalid Date'; }
isValidDate(new Date('WTH'));

टाइपस्क्रिप्ट तरीका:

const isValidDate = dateObject => new Date(dateObject ).toString() !== 'Invalid Date';
isValidDate(new Date('WTH'));

1
यकीन नहीं होता कि मैं कुछ याद कर रहा हूँ, लेकिन नई तारीख () दो बार व्यर्थ नहीं कर रहा हूँ?
जॉन कैटमूल

2
बाद का टाइपस्क्रिप्ट से कोई लेना- देना नहीं है। यह पूरी तरह से वैध जेएस है।
हैकेल

9

अच्छा समाधान! सहायक कार्यों के मेरे पुस्तकालय में शामिल है, अब यह इस तरह दिखता है:

Object.isDate = function(obj) {
/// <summary>
/// Determines if the passed object is an instance of Date.
/// </summary>
/// <param name="obj">The object to test.</param>

    return Object.prototype.toString.call(obj) === '[object Date]';
}

Object.isValidDate = function(obj) {
/// <summary>
/// Determines if the passed object is a Date object, containing an actual date.
/// </summary>
/// <param name="obj">The object to test.</param>

    return Object.isDate(obj) && !isNaN(obj.getTime());
}

9

यह सिर्फ मेरे लिए काम किया

new Date('foo') == 'Invalid Date'; //is true

हालांकि यह काम नहीं किया

new Date('foo') === 'Invalid Date'; //is false

5
मेरा मानना ​​है कि यह ब्राउज़र पर निर्भर है।
बैरीपिकर

@barrypicker क्या मतलब है कि यह ब्राउज़र पर निर्भर है?
अजिल ओ।

आप कर सकते हैं: `${new Date('foo')}` === 'Invalid Date'
Daniele Vrut

9

Angular.js परियोजनाओं के लिए आप उपयोग कर सकते हैं:

angular.isDate(myDate);

3
यह किसी अमान्य ऑब्जेक्ट के साथ आरंभ किए गए दिनांक ऑब्जेक्ट का परीक्षण करते समय के लिए सही है।
dchhetri 19

6

इनमें से किसी भी जवाब ने मेरे लिए काम नहीं किया (सफारी 6.0 में परीक्षण किया गया) जब दिनांक 2/31/2012 को मान्य करने की कोशिश की जा रही थी, हालांकि, 31 से अधिक किसी भी तारीख की कोशिश करते समय वे ठीक काम करते हैं।

इसलिए मुझे थोड़ा बल लगाना पड़ा। मान लें कि दिनांक प्रारूप में है mm/dd/yyyy। मैं @ उत्तर का उपयोग कर रहा हूं:

Date.prototype.valid = function() {
    return isFinite(this);
}    

function validStringDate(value){
    var d = new Date(value);
    return d.valid() && value.split('/')[0] == (d.getMonth()+1);
}

validStringDate("2/29/2012"); // true (leap year)
validStringDate("2/29/2013"); // false
validStringDate("2/30/2012"); // false

(नई तिथि ('2/30/2014'))। मान्य () सही है
आंद्रे

1
जब से मैंने इसका उत्तर दिया है तब से कुछ समय बाद, आपको && value.split('/')[0] == (d.getMonth()+1);
Dex

का उपयोग करना new Date('string date')समतुल्य है Date.parse('string date'), देखें: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ताकि आपको गलत सही या गलत मान मिल सकें।
Golddragon007

5

उपरोक्त समाधानों में से किसी ने भी मेरे लिए काम नहीं किया लेकिन काम क्या है

function validDate (d) {
        var date = new Date(d);
        var day = ""+date.getDate();
        if( day.length == 1)day = "0"+day;
        var month = "" +( date.getMonth() + 1);
        if( month.length == 1)month = "0"+month;
        var year = "" + date.getFullYear();

        return ((month + "/" + day + "/" + year) == d);
    }

उपरोक्त कोड यह देखेगा कि जेएस 02/31/2012 को 03/02/2012 में बनाता है कि इसकी वैधता नहीं है


3
ठीक है, लेकिन यह परीक्षण अगर एक स्ट्रिंग एम / डी / वाई प्रारूप में एक तारीख है, न कि "वैध और अवैध तारीख वस्तुओं के बीच का अंतर"। यह वास्तव में नहीं है कि यह किस बारे में सवाल है।
Borgar

प्रारूप के खिलाफ इसकी जाँच का कारण क्या है, यह जाँचने के लिए कि क्या तारीख बदलने के बाद तारीख बदल गई है
जॉन

क्या ओपी एक बूलियन को लौटाने की विधि नहीं पूछ रहा है, न कि एक स्वरूपित स्ट्रिंग?
बैरीपिकर

1
नमूना कोड एक बूलियन लौटाता है, फॉर्मेटिंग कुछ अमान्य मामलों के लिए परीक्षण में एक भूमिका निभाता है।
जॉन


4

मैंने यह फ़ंक्शन लिखा है। इसे एक स्ट्रिंग पैरामीटर पास करें और यह निर्धारित करेगा कि यह एक मान्य तिथि है या नहीं इस प्रारूप "dd / MM / yyyy" पर आधारित है।

यहाँ एक परीक्षा है

इनपुट: "हाहा", आउटपुट: गलत।

इनपुट: "29/2/2000", आउटपुट: सच।

इनपुट: "29/2/2001", आउटपुट: गलत।

function isValidDate(str) {
    var parts = str.split('/');
    if (parts.length < 3)
        return false;
    else {
        var day = parseInt(parts[0]);
        var month = parseInt(parts[1]);
        var year = parseInt(parts[2]);
        if (isNaN(day) || isNaN(month) || isNaN(year)) {
            return false;
        }
        if (day < 1 || year < 1)
            return false;
        if(month>12||month<1)
            return false;
        if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day > 31)
            return false;
        if ((month == 4 || month == 6 || month == 9 || month == 11 ) && day > 30)
            return false;
        if (month == 2) {
            if (((year % 4) == 0 && (year % 100) != 0) || ((year % 400) == 0 && (year % 100) == 0)) {
                if (day > 29)
                    return false;
            } else {
                if (day > 28)
                    return false;
            }      
        }
        return true;
    }
}

4

Date.prototype.toISOStringRangeErrorअमान्य तिथियों पर कम से कम (क्रोमियम और फ़ायरफ़ॉक्स में) फेंकता है। आप इसे सत्यापन के साधन के रूप में उपयोग कर सकते हैं और isValidDateइस तरह की (ईएएफपी) की आवश्यकता नहीं हो सकती है । अन्यथा यह है:

function isValidDate(d)
{
  try
  {
    d.toISOString();
    return true;
  }
  catch(ex)
  {
    return false;    
  }    
}

1
ऐसा लगता है कि यह केवल एक ही कार्य है जो ECMA-262 परिभाषा द्वारा एक त्रुटि फेंकता है। 15.9.5.43 Date.prototype.toISOString () यह फ़ंक्शन एक स्ट्रिंग मान लौटाता है जो इस दिनांक ऑब्जेक्ट द्वारा दर्शाए गए समय में आवृत्ति का प्रतिनिधित्व करता है। स्ट्रिंग का प्रारूप 15.9.1.15 में परिभाषित दिनांक समय स्ट्रिंग प्रारूप है। सभी फ़ील्ड स्ट्रिंग में मौजूद हैं। समय क्षेत्र हमेशा UTC होता है, जो कि प्रत्यय Z द्वारा निरूपित किया जाता है। यदि इस वस्तु का समय मान एक परिमित संख्या नहीं है, तो रेंजरेयर अपवाद को फेंक दिया जाता है।
हेनरी लियू

3

बोरगर के दृष्टिकोण से प्रेरित होकर मैंने यह सुनिश्चित किया है कि कोड न केवल तारीख को मान्य करता है, बल्कि वास्तव में यह सुनिश्चित करता है कि तारीख एक वास्तविक तारीख है, जिसका अर्थ है कि 31/09/2011 और 29/02/2011 जैसी तारीखों की अनुमति नहीं है।

function(dateStr) {
    s = dateStr.split('/');
    d = new Date(+s[2], s[1]-1, +s[0]);
    if (Object.prototype.toString.call(d) === "[object Date]") {
        if (!isNaN(d.getTime()) && d.getDate() == s[0] && 
            d.getMonth() == (s[1] - 1)) {
            return true;
        }
    }
    return "Invalid date!";
}

लेकिन ... ऊपर दिए गए तरीके (@ बोर्गर्स और अन्य) पहले से ही इस प्रकार की वैधता के लिए जांच करते हैं ... मुझे यह मुद्दा नहीं मिल सकता है।
नीला

बोरगर की नहीं - अपने जवाब के लिए अपनी टिप्पणी देखें।
ईएमएल

1
यह समाधान केवल तभी काम करता है जब आपका देश dd/MM/yyyyसंकेतन का उपयोग करता है। इसके अलावा, यह trueतब लौटाता है जब यह वैध होता है और 'Invalid date!'यदि यह नहीं है, तो बेहतर रिटर्न केवल 1 प्रकार का होता है।
A1rPun 10

3

मैंने सबसे अच्छा प्रदर्शन परिणामों को मिलाया, जो मुझे दिए गए ऑब्जेक्ट के आसपास मिलते हैं:

परिणाम निम्नलिखित है:

function isValidDate(input) {
  if(!(input && input.getTimezoneOffset && input.setUTCFullYear))
    return false;

  var time = input.getTime();
  return time === time;
};

2

स्ट्रिंग का दिनांक ऑब्जेक्ट यह पता लगाने के लिए अधिक सरल और विश्वसनीय तरीका है कि क्या दोनों फ़ील्ड मान्य दिनांक हैं। उदा। यदि आप दिनांक इनपुट फ़ील्ड में यह "-------" दर्ज करते हैं। ऊपर दिए गए कुछ उत्तर काम नहीं करेंगे।

jQuery.validator.addMethod("greaterThan", 

    function(value, element, params) {
        var startDate = new Date($(params).val());
        var endDate = new Date(value);

        if(startDate.toString() === 'Invalid Date' || endDate.toString() === 'Invalid Date') {
            return false;
        } else {
            return endDate > startDate;
        }
    },'Must be greater than {0}.');

2

चयनित उत्तर उत्कृष्ट है, और मैं इसका उपयोग भी कर रहा हूं। हालाँकि, यदि आप उपयोगकर्ता दिनांक इनपुट को मान्य करने का एक तरीका खोज रहे हैं, तो आपको इस बात की जानकारी होनी चाहिए कि मान्य ऑब्जेक्ट में अमान्य निर्माण तर्क दिखाई देने के बारे में दिनांक ऑब्जेक्ट बहुत स्थायी है। निम्नलिखित इकाई परीक्षण कोड बिंदु को दिखाता है:

QUnit.test( "valid date test", function( assert ) {
  //The following are counter-examples showing how the Date object will 
  //wrangle several 'bad' dates into a valid date anyway
  assert.equal(isValidDate(new Date(1980, 12, 15)), true);
  d = new Date();
  d.setFullYear(1980);
  d.setMonth(1);
  d.setDate(33);
  assert.equal(isValidDate(d), true);
  assert.equal(isValidDate(new Date(1980, 100, 150)), true);
  //If you go to this exterme, then the checker will fail
  assert.equal(isValidDate(new Date("This is junk")), false);
  //This is a valid date string
  assert.equal(isValidDate(new Date("November 17, 1989")), true);
  //but is this?
  assert.equal(isValidDate(new Date("November 35, 1989")), false);  
  //Ha!  It's not.  So, the secret to working with this version of 
  //isValidDate is to pass in dates as text strings... Hooboy
  //alert(d.toString());
});

2
function isValidDate(strDate) {
    var myDateStr= new Date(strDate);
    if( ! isNaN ( myDateStr.getMonth() ) ) {
       return true;
    }
    return false;
}

इसे इस तरह बुलाओ

isValidDate(""2015/5/2""); // => true
isValidDate(""2015/5/2a""); // => false

2

टॉप रेटेड उत्तर पर आधारित एक तैयार कार्य:

  /**
   * Check if date exists and is valid.
   *
   * @param {String} dateString Date in YYYY-mm-dd format.
   */
  function isValidDate(dateString) {
  var isValid = false;
  var date;

  date =
    new Date(
      dateString);

  if (
    Object.prototype.toString.call(
      date) === "[object Date]") {

    if (isNaN(date.getTime())) {

      // Date is unreal.

    } else {
      // Date is real if month and day match each other in date and string (otherwise may be shifted):
      isValid =
        date.getUTCMonth() + 1 === dateString.split("-")[1] * 1 &&
        date.getUTCDate() === dateString.split("-")[2] * 1;
    }
  } else {
    // It's not a date.
  }

  return isValid;
}

2

सरल और सुरुचिपूर्ण समाधान:

const date = new Date(`${year}-${month}-${day} 00:00`)
const isValidDate = (Boolean(+date) && date.getDate() == day)

सूत्रों का कहना है:

[१] https://medium.com/@esganzerla/simple-date-validation-with-javascript-caea0f71883c

[२] गलत तारीख नई तारीख () जावास्क्रिप्ट में दिखाई गई है


1
date.getDate() == dayयह निर्धारित करने के लिए अपर्याप्त है कि क्या तारीख वैध है। मूल दिनांक स्वरूप कुछ कार्यान्वयनों में अमान्य दिनांक लौटाएगा, भले ही वह दिनांक मान्य हो या न हो। इसके अलावा "1970-01-01 00:00" यदि सही ढंग से पार्स किया गया तो गलत वापस आएगा (यानी Boolean(+new Date("1970-01-01"))गलत रिटर्न)।
रॉबग

चेतावनी: यह सफारी में काम नहीं करेगा
विगांत

यह सफारी में काम करेगा यदि आप प्रारूप का उपयोग करते हैं तो const date = new Date(year, month, day); ध्यान दें कि महीना 0 इस तरह से अनुक्रमित है ताकि आपको इसे सही ढंग से पूरा करने के लिए एक को घटाना पड़े।
विगेंट

1

मुझे लगता है कि यह कुछ लंबी प्रक्रिया है। हम इसे नीचे दिखाए अनुसार घटा सकते हैं:

 function isValidDate(dateString) {
        debugger;
        var dateStringSplit;
        var formatDate;

        if (dateString.length >= 8 && dateString.length<=10) {
            try {
                dateStringSplit = dateString.split('/');
                var date = new Date();
                date.setYear(parseInt(dateStringSplit[2]), 10);
                date.setMonth(parseInt(dateStringSplit[0], 10) - 1);
                date.setDate(parseInt(dateStringSplit[1], 10));

                if (date.getYear() == parseInt(dateStringSplit[2],10) && date.getMonth()+1 == parseInt(dateStringSplit[0],10) && date.getDate() == parseInt(dateStringSplit[1],10)) {
                    return true;
                }
                else {
                    return false;
                }

            } catch (e) {
                return false;
            }
        }
        return false;
    }

3
अमान्य दिनांक उदाहरणों को खोजने के लिए पूछे जाने वाले प्रश्न, तार नहीं, और इसके अलावा: कौन कहता है कि किसी तिथि को अग्रेषित-स्लेश के अलावा किसी अन्य चीज़ द्वारा सीमांकित नहीं किया जा सकता है?
जॉन जेड

1

दिनांक के इंट-आधारित घटकों के लिए:

var is_valid_date = function(year, month, day) {
    var d = new Date(year, month - 1, day);
    return d.getFullYear() === year && (d.getMonth() + 1) === month && d.getDate() === day
};

टेस्ट:

    is_valid_date(2013, 02, 28)
&&  is_valid_date(2016, 02, 29)
&& !is_valid_date(2013, 02, 29)
&& !is_valid_date(0000, 00, 00)
&& !is_valid_date(2013, 14, 01)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.