使用 JavaScript 检查日期是否有效
Check if a Date is valid using JavaScript
检查日期是否有效:
- 检查日期是否是
Date
对象的实例。 - 检查将日期传递给
isNaN()
函数是否返回false
. - 如果满足这两个条件,则该日期有效。
索引.js
function dateIsValid(date) { return date instanceof Date && !isNaN(date); } console.log(dateIsValid(new Date('2022-03-36'))); // 👉️ false console.log(dateIsValid(new Date())); // 👉️ true console.log(dateIsValid(new Date('2022-03-24'))); // 👉️ true
我们创建了一个可重用的函数,它将一个Date
对象作为参数并检查日期是否有效。
该instanceof
运算符返回一个布尔值,指示构造函数的原型属性是否出现在对象的原型链中。
索引.js
console.log(new Date() instanceof Date); // 👉️ true console.log({} instanceof Date); // 👉️ false console.log([] instanceof Date); // 👉️ false console.log('hi' instanceof Date); // 👉️ false
只有当左边的值是使用
Date()
构造函数或扩展它的类创建的时,
instanceof
运算符才会返回。true
第二个条件检查将日期传递给
isNaN
函数是否返回false
.
索引.js
function dateIsValid(date) { return date instanceof Date && !isNaN(date); }
该isNaN
函数接受一个值并尝试确定该值是否NaN
(不是数字)。
如果该值还不是数字,该
isNaN
函数会自动将其转换为一。当您将有效日期转换为数字时,您会得到一个时间戳 – 从 1 月 1 日到给定日期之间经过的毫秒数。
索引.js
// 👇️ 1643112264226 console.log(Number(new Date())); // 👇️ NaN console.log(Number(new Date('2022-03-36')));
在第二个示例中,我们向Date
构造函数传递了一个无效日期,因此将值转换为返回的数字NaN
。
如果
Date
是构造函数的一个实例Date()
并且将其转换为数字没有NaN
返回给我们(不是数字),那么我们有一个有效的Date
.应该注意的是,如果
对象是在另一个上下文中创建的,例如在外部 iframe 中,则instanceof
运算符将不起作用。Date
如果您
Date
在外部窗口或 iframe 中创建对象,请将对象的原型字符串化,而不是使用运算符。 instanceof
索引.js
function dateIsValid(date) { return ( Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date) ); } console.log(dateIsValid(new Date('2022-03-36'))); // 👉️ false console.log(dateIsValid(new Date())); // 👉️ true console.log(dateIsValid(new Date('2022-03-24'))); // 👉️ true
上面的代码片段只应在您Date
在外部窗口(例如 iframe)中创建对象时使用。
在所有其他情况下,instanceof
运算符完成了工作并且更具可读性。
或者,您可以使用鸭子类型。
索引.js
function dateIsValid(date) { if ( typeof date === 'object' && date !== null && typeof date.getTime === 'function' && !isNaN(date) ) { return true; } return false; } console.log(dateIsValid(new Date('2022-03-36'))); // 👉️ false console.log(dateIsValid(new Date())); // 👉️ true console.log(dateIsValid(new Date('2022-03-24'))); // 👉️ true console.log(dateIsValid([])); // 👉️ true console.log(dateIsValid({})); // 👉️ true console.log(dateIsValid(null)); // 👉️ true
使用 duck-typing 时,我们只需检查对象是否实现了特定的属性或方法,如果实现了,我们就假定它是正确类型的对象。
我们首先检查传入的值是否为object
.
由于null
在 JavaScript 中也有一个对象类型,我们必须显式检查该值是否为 not null
。
然后,我们检查对象是否有getTime
一个函数属性。Date
您可以对对象实现的任何其他属性或方法重复此过程。