Monday, 28 August 2017

Detecting an "invalid date" Date instance in JavaScript



I'd like to tell the difference between valid and invalid date objects in JS, but couldn't figure out how:



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'



Any ideas for writing an isValidDate function?




  • Ash recommended Date.parse for parsing date strings, which gives an authoritative way to check if the date string is valid.

  • What I would prefer, if possible, is have my API accept a Date instance and to be able to check/assert whether it's valid or not. Borgar's solution does that, but I need to test it across browsers. I also wonder whether there's a more elegant way.

  • Ash made me consider not having my API accept Date instances at all, this would be easiest to validate.

  • Borgar suggested testing for a Date instance, and then testing for the Date's time value. If the date is invalid, the time value is NaN. I checked with ECMA-262 and this behavior is in the standard, which is exactly what I'm looking for.


Answer



Here's how I would do it:




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

}


Update [2018-05-31]: If you are not concerned with Date objects from other JS contexts (external windows, frames, or iframes), this simpler form may be preferred:



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

No comments:

Post a Comment

casting - Why wasn't Tobey Maguire in The Amazing Spider-Man? - Movies & TV

In the Spider-Man franchise, Tobey Maguire is an outstanding performer as a Spider-Man and also reprised his role in the sequels Spider-Man...