patternjavascriptCritical
Detecting an "invalid date" Date instance in JavaScript
Viewed 0 times
instancedatedetectinginvalidjavascript
Problem
I'd like to tell the difference between valid and invalid date objects in JS, but couldn't figure out how:
Any ideas for writing an
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.parsefor 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
Dateinstances at all, this would be easiest to validate.
- Borgar suggested testing for a
Dateinstance, and then testing for theDate's time value. If the date is invalid, the time value isNaN. I checked with ECMA-262 and this behavior is in the standard, which is exactly what I'm looking for.
Solution
Here's how I would do it:
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:
Update [2021-02-01]: Please note that there is a fundamental difference between "invalid dates" (
if (Object.prototype.toString.call(d) === "[object Date]") {
// it is a date
if (isNaN(d)) { // d.getTime() or d.valueOf() will also work
// date object is not valid
} else {
// date object is valid
}
} else {
// not a date object
}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);
}Update [2021-02-01]: Please note that there is a fundamental difference between "invalid dates" (
2013-13-32) and "invalid date objects" (new Date('foo')). This answer does not deal with validating date input, only if a Date instance is valid.Code Snippets
if (Object.prototype.toString.call(d) === "[object Date]") {
// it is a date
if (isNaN(d)) { // d.getTime() or d.valueOf() will also work
// date object is not valid
} else {
// date object is valid
}
} else {
// not a date object
}function isValidDate(d) {
return d instanceof Date && !isNaN(d);
}Context
Stack Overflow Q#1353684, score: 1885
Revisions (0)
No revisions yet.