协慌网

登录 贡献 社区

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

我想告诉 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 建议测试Date实例,然后测试Date的时间值。如果日期无效,则时间值为NaN 。我用ECMA-262检查了这个行为是标准的,这正是我正在寻找的。

答案

我是这样做的:

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
}

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

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

而不是使用new Date()你应该使用:

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

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

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

您可以检查的有效性Date对象d通过

d instanceof Date && isFinite(d)

为避免跨框架问题,可以用。替换instanceof检查

Object.prototype.toString.call(d) === '[object Date]'

Borgar 的答案中调用getTime()是不必要的,因为isNaN()isFinite()都隐式转换为数字。