在 JavaScript 中检测“无效日期”日期实例

2022-08-29 21:56:13

我想在JS中区分有效和无效的日期对象,但无法弄清楚如何:

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'

编写函数的任何想法?isValidDate

  • 建议使用 Ash 来解析日期字符串,这提供了一种权威方法来检查日期字符串是否有效。Date.parse
  • 如果可能的话,我希望我的API接受一个Date实例,并能够检查/断言它是否有效。Borgar的解决方案可以做到这一点,但我需要在浏览器上进行测试。我也想知道是否有更优雅的方式。
  • Ash让我考虑根本不让我的API接受实例,这将是最容易验证的。Date
  • Borgar建议测试一个实例,然后测试的时间值。如果日期无效,则时间值为 。我检查了ECMA-262,这种行为符合标准,这正是我正在寻找的。DateDateNaN

答案 1

以下是我的做法:

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
}

更新 [2018-05-31]:如果您不关心来自其他 JS 上下文(外部窗口、框架或 iframe)的 Date 对象,则可能首选以下更简单的形式:

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

更新[2021-02-01]:请注意,“无效日期”()和“无效日期对象”()之间存在根本区别。仅当 Date 实例有效时,此答案处理验证日期输入。2013-13-32new Date('foo')


答案 2

与其使用,不如使用:new Date()

var timestamp = Date.parse('foo');

if (isNaN(timestamp) == false) {
  var d = new Date(timestamp);
}

Date.parse()返回一个时间戳,这是一个整数,表示自 01/Jan/1970 以来的毫秒数。如果它无法解析提供的日期字符串,它将返回。NaN