如何检查对象是否为日期?

我在网页上有一个烦人的错误:

date.GetMonth()不是函数

因此,我想我做错了什么。变量date不是type的对象Date如何检查Javascript中的数据类型?我尝试添加if (date),但无效。

function getFormatedDate(date) {
    if (date) {
       var month = date.GetMonth();
    }
}

因此,如果我想编写防御性代码并阻止格式化日期(不是一个日期),该怎么办?

谢谢!

更新:我不想检查日期的格式,但是我想确保传递给方法的参数getFormatedDate()是type Date

A小胖2020/03/12 14:20:32

你不能只是用

function getFormatedDate(date) {
    if (date.isValid()) {
       var month = date.GetMonth();
    }
}
十三蛋蛋2020/03/12 14:20:32

受此答案启发,此解决方案适用于我的情况(我需要检查从API接收的值是否为日期):

!isNaN(Date.parse(new Date(YourVariable)))

这样,如果它是来自客户端或其他任何对象的随机字符串,则可以找出它是否是类似Date的对象。

StafanDavaid2020/03/12 14:20:32

我们也可以通过以下代码对其进行验证

var a = new Date();
a.constructor === Date
/*
true
*/

在此处输入图片说明

小胖宝儿2020/03/12 14:20:32

另一个变体:

Date.prototype.isPrototypeOf(myDateObject)
西里宝儿Harry2020/03/12 14:20:32

true如果是日期,则返回此函数false

function isDate(myDate) {
    return myDate.constructor.toString().indexOf("Date") > -1;
} 
Tom蛋蛋2020/03/12 14:20:32

实际上,日期将是类型Object但是您可以检查对象是否具有getMonth方法以及是否可调用。

function getFormatedDate(date) {
    if (date && date.getMonth && date.getMonth.call) {
       var month = date.getMonth();
    }
}
小小卡卡西2020/03/12 14:20:32

我一直在使用一种简单得多的方法,但是不确定是否仅在ES6中可用。

let a = {name: "a", age: 1, date: new Date("1/2/2017"), arr: [], obj: {} };
console.log(a.name.constructor.name); // "String"
console.log(a.age.constructor.name);  // "Number"
console.log(a.date.constructor.name); // "Date"
console.log(a.arr.constructor.name);  // "Array"
console.log(a.obj.constructor.name);  // "Object"

但是,这对null或undefined无效,因为它们没有构造函数。

前端飞云2020/03/12 14:20:32

我发现的最好方法是:

!isNaN(Date.parse("some date test"))
//
!isNaN(Date.parse("22/05/2001"))  // true
!isNaN(Date.parse("blabla"))  // false
Eva神奇2020/03/12 14:20:32

您可以检查是否存在特定于Date对象的函数:

function getFormatedDate(date) {
    if (date.getMonth) {
        var month = date.getMonth();
    }
}
Mandy小卤蛋凯2020/03/12 14:20:32

UnderscoreJSLodash有一个调用的函数.isDate()这似乎正是你所需要的。这是值得看各自的实现:Lodash而isDateUnderscoreJs

猪猪阳光2020/03/12 14:20:32

如上所述,最简单的方法就是在使用该功能之前先检查该功能是否存在。如果您真的关心它是一个Date,而不仅仅是具有getMonth()函数的对象,请尝试以下操作:

function isValidDate(value) {
    var dateWrapper = new Date(value);
    return !isNaN(dateWrapper.getDate());
}

这将创建值的克隆(如果是)Date,或者创建无效的日期。然后,您可以检查新日期的值是否无效。

Harry小卤蛋2020/03/12 14:20:32

该功能getMonth()不是GetMonth()

无论如何,您可以通过执行此操作来检查对象是否具有getMonth属性。它不一定意味着该对象是Date,而是任何具有getMonth属性的对象。

if (date.getMonth) {
    var month = date.getMonth();
}
JinJin老丝2020/03/12 14:20:32

为了检查该值是否是标准JS-date对象的有效类型,可以使用以下谓词:

function isValidDate(date) {
  return date && Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date);
}
  1. date检查参数是否不是falsy值undefinednull0""等。)
  2. Object.prototype.toString.call(date)返回给定对象类型本机字符串表示形式-在我们的例子中"[object Date]"因为date.toString()覆盖其父方法,所以我们需要直接从.. .call.apply该方法Object.prototype
  3. !isNaN(date)最后检查该值是否不是Invalid Date
Eva理查德阳光2020/03/12 14:20:32

您可以使用以下代码:

(myvar instanceof Date) // returns true or false