Wednesday, May 14, 2008

Check/Validate a date string in Javascript


I was looking for a simple Javascript function to check or validate a date string and most of the examples I have come across are too verbose. So I came up with a simple function that uses Regular Expressions and the built-in Date class.
//Checks if a given date string is in 
// one of the valid formats:
// a) M/D/YYYY format
// b) M-D-YYYY format
// c) M.D.YYYY format
// d) M_D_YYYY format
function isDate(s)
{   
  // make sure it is in the expected format
  if (s.search(/^\d{1,2}[\/|\-|\.|_]\d{1,2}[\/|\-|\.|_]\d{4}/g) != 0)
     return false;

  // remove other separators that are not valid with the Date class    
  s = s.replace(/[\-|\.|_]/g, "/"); 

  // convert it into a date instance
  var dt = new Date(Date.parse(s));     

  // check the components of the date
  // since Date instance automatically rolls over each component
  var arrDateParts = s.split("/");
     return (
         dt.getMonth() == arrDateParts[0]-1 &&
         dt.getDate() == arrDateParts[1] &&
         dt.getFullYear() == arrDateParts[2]
     );   
}
 
// test function to test the isDate function
function test_isDate()
{
  var arrDates = [ 
   '05/15/2008', '05-15-2008', 
   '05.15.2008', '05_15_2008',
   '15/15/2008', '05/35/2008',
   '05/15/1908', '15-15-2008',
   'a/1b/2008', '05/30/a008' ];
  for (var d in arrDates) 
     document.writeln("isDate('" + arrDates[d] + "') : " + isDate(arrDates[d]) + "");
} 
By the way, I am using a Javascript utility called SyntaxHighlighter, to render this code. If you have not already used this utility, I would highly recommend you check it out.

The code is self explanatory and when you run the test function, you get the following results:

Hope you find this useful. Please let me know if you come across any other elegant and efficient ways to check if a given string is a valid date or not using Javascript.

Happy coding,
Sonny

2 comments:

Anonymous said...

What if we want to change it to YYYY-MM-DD format?

OutbackVandy said...

I optimized the code a bit. First of all, you can move the regular expression to find [.-_] to the beginning to simply the following expressions. Second, this function will test for both 'Y/M/D' and 'M/D/Y'. Third, the returned value is a valid date if true.

top.isDate = function (s) {
s = s.replace(/[\-|\.\_]/g, '/');
s = s.replace(/^(\d{1,2})\/(\d{1,2})\/(\d{4})/g , '$3/$1/$2');
if (s.search(/^\d{4}\/\d{1,2}\/\d{1,2}\b/g) != -1) {
var dt = new Date(Date.parse(s));
var arrDate = s.split("/");
if (dt.getMonth() == arrDate[1]-1 &&
dt.getDate() == arrDate[2] &&
dt.getFullYear() == arrDate[0]) {
var m = dt.getMonth() + 1;
var d = dt.getDate();
m = m < 10 ? '0' + m : m;
d = d < 10 ? '0' + d : d;
return arrDate[0] + '/' + m + '/' + d;
}
else {
return false;
}
} else {
return false;
}
}