在 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 ,这种行为符合标准,这正是我正在寻找的。

原文由 orip 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

这是我的做法:

 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] :请注意,“无效日期”( 2013-13-32 )和“无效日期 _对象_”( new Date('foo') )之间存在根本区别。此答案 处理验证日期输入,仅当 Date 实例有效时。

原文由 Borgar 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

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

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

原文由 Ash 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题