javascriptdate

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?


Solution

  • Here's how I would do it:

    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.