我想区分 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
函数的任何想法?
Date.parse
用于解析日期字符串,它提供了一种权威的方式来检查日期字符串是否有效。Date
实例,这将最容易验证。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);
}
instanceof 跨帧中断。Duck-typing 也可以正常工作:validDate == d && d.getTime && !isNaN(d.getTime()); - 由于问题是针对一般效用函数,我更喜欢更严格。
@Borgar,刚刚找到我的答案:“在多帧 DOM 环境中编写脚本时会出现问题。简而言之,在一个 iframe 中创建的数组对象不与在另一个 iframe 中创建的数组共享 [[Prototype]] . 它们的构造函数是不同的对象,因此 instanceof 和构造函数检查都失败了。”
你甚至不需要
d.getTime
只isNan(d)
可以简化成这样:
d instanceof Date && !isNaN(d.getTime())
感谢您的回答,但我想强调@Borgar 和@blueprintChris 的评论:
1
例如,如果我解析数字,我仍然会得到一个有效日期,Mon Jan 01 2001 00:00:00
该日期确实是一个日期,但是对于我的应用程序而言,它完全没用. 因此,至少在我的情况下需要更多的输入验证。这个答案验证了一个dateObject
不是Date
!