I was searching the web for JavaScript date validation code. All I found were lots of really bad ideas. Some were quite complicated. John Gang was on the right track. I didn’t see Chris Hogben’s article initially, but he used the right algorithm.
Still, nobody offered the complete solution. Given a date string YYYY-MM-DD, is the date valid?
The smart way to do this is to (a) parse the date string with a regular expression, (b) construct a date object and (c) compare what you got out of the date object to what you put in. To make this really convenient, we’ll use JavaScript’s proptotype functionality to extend the String class, making this available to any string:
var IsoDateRe = new RegExp("^([0-9]{4})-([0-9]{2})-([0-9]{2})$");
var matches = IsoDateRe.exec(this);
if (!matches) return false;
var composedDate = new Date(matches[1], (matches[2] – 1), matches[3]);
return ((composedDate.getMonth() == (matches[2] – 1)) &&
(composedDate.getDate() == matches[3]) &&
(composedDate.getFullYear() == matches[1]));
}
Here’s the method in action:
alert(a + (a.isValidDate() ? " is a valid date" : " is not a valid date"));
Thank you, this is a very good script, just what I was looking for. I will reference you in my code.
Absolute lifesaver. Just made a quick change for UK date format and all is good. Thanks
Thanks! exactly what i needed :)
thanks a lot.
that’s exactly what i am looking for.
Thank you very much.This was what i needed for my project.
This is the simpliest date validation method I found after searching the web. Thanks…
how to make format dd-mm-yyyy
thanks
hello..
actually i’m looking 4 this solution too..about yyyy-mm-dd format…even i didn’t find the exact solution but then, i mix up two javacript example i found in the internet….just wanna share my knowledge..
then become like dis..:p
//———-start
function isValidDate()
{
var datePat = /^(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])$/;//yyyy-mm-dd 1900-2099
dateStr = document.form.dob.value;//just change dis input value name to use
var M = dateStr.match(datePat); // is the format ok?
var s = dateStr.split(/\D/);
var d = new Date(s[0]*1,s[1]-1,s[2]*1);
var L = d.lastDay()[s[1]-1];
if(!(M && s[2]<=L))
{
alert(“Date format is wrong”);
}
}
Date.prototype.lastDay=function()
{
var A=[];
for(var i=1; i<=12; i++) {
A[A.length]= new Date(this.getFullYear(), i,0).getDate();
}
return A;
}
//—————–end
-the datePat regular expression is to validate year exactly from year 1900-2099 n for the month+day will not really accurate if below problem occur
-the Date.prototype.lastDay=function() is to validate the day+month, as example if 1999-02-30 were entered…it will know dat is wrong…
-this code validate all…cover all event! :p
-bemo,
bout the dd-mm-yyyy, i’ll try to create one if i have free time..:D
//human knowledge belong to the world!!!!!!!!!
//zack de maniac
Thanks for this article. This article is really helpful.
While this may be a reasonable and fairly effective solution,
This explanation is FAR above the heads of all those expect skilled professionals who have years of expertise under their belts.
Rather than benefit only those with advanced knowledge, why not post an easier to understand implementation example?
For the lesser skilled of course.
After all, this was posted with the intent to assist others was it not?
Cheers!
Thank you very much. This article is very simple and helpful.
Thanks a lot…
Its simple & easy to get going
This gives me an error “Uncaught SyntaxError: Unexpected number ” at the line starting “var composedDate = “
Still helping nine years later. Thanks!