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

IT技术 javascript date
2021-01-31 22:27:01

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

date.GetMonth() 不是函数

所以,我想我做错了什么。变量date不是类型的对象Date如何在 Javascript 中检查数据类型?我试图添加一个if (date),但它不起作用。

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

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

谢谢!

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

6个回答

作为鸭子输入的替代方法

typeof date.getMonth === 'function'

您可以使用instanceof运算符,即但它也会为无效日期返回 true,例如new Date('random_string')也是 Date 的实例

date instanceof Date

如果对象跨帧边界传递,这将失败。

对此的解决方法是通过以下方式检查对象的类

Object.prototype.toString.call(date) === '[object Date]'
new Date('something') instanceof Datetrue在 Chrome 中返回那就行不通了。
2021-03-21 22:27:01
检测日期类型对象(与普通对象或字符串相反)和验证您希望是日期的对象是两个不同的任务。在许多情况下,函数的输入可能是多种不同数据类型之一。就我而言,我可以相信我得到的任何 Date 对象都是有效的(它不是直接来自客户端)如果验证是一个问题,这里有一个包含许多选项的帖子。stackoverflow.com/questions/1353684/...
2021-03-23 22:27:01
@Simon:JS 全局变量是当前全局对象的本地对象(又名windowself);不同的框架有自己的全局对象,它们的属性(即全局对象)指的是不同的对象:Dateframe1 中的函数对象与 frame2 中的函数对象不同Date对于 也是如此Date.prototype,这就是instanceof失败的原因Date.prototype来自 frame1 的Date实例不是来自 frame2 的原型链的一部分
2021-03-24 22:27:01
出于兴趣,您是否知道跨越帧边界时失败的原因?
2021-03-29 22:27:01
克里斯托夫,你所谓的“框架”是什么?IFRAME,FRAMESET 中的每个框架还是其他东西(我的意思是 JS 特定的,而不是 HTML 的东西)?
2021-04-02 22:27:01

您可以使用以下代码:

(myvar instanceof Date) // returns true or false
instanceof 可能会触发假阴性,请参阅 Christoph 对他自己的回答的评论。
2021-03-13 22:27:01
@doremi 这是instanceof触发假阴性的演示jsbin.com/vufufoq/edit?html,js,console
2021-04-05 22:27:01
为什么这不是公认的或更受欢迎的答案?简单地检查 date 是否具有 .getMonth 属性可能会触发误报。
2021-04-06 22:27:01

为了检查该值是否是标准 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.
@Nick 日期是一个数字。
2021-03-17 22:27:01
WowisNaN可用于检查Date. 这是某种 PHP 级别的疯狂。
2021-03-18 22:27:01
@Josiah 好吧,当然,删除所有上下文,那里有一个时间戳:typeof Date.now() === "number",但是:typeof new Date() === "object"但更现实的是,日期是空间中的时间和位置。
2021-03-22 22:27:01

功能是getMonth(),不是GetMonth()

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

if (date.getMonth) {
    var month = date.getMonth();
}
检查它是否可调用: if (date.getMonth && typeof date.getMonth === "function") {...}
2021-03-22 22:27:01

如上所述,在使用之前检查该函数是否存在可能是最简单的。如果你真的关心它是一个Date,而不仅仅是一个带有getMonth()函数的对象,试试这个:

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

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

没错,@RicardoSanchez。如果您可能Object.prototype.toString.call(value) === '[object Date]'会得到数字,您可能想要使用已接受的答案 ( )。此答案中的方法确实会告诉您 是否value可转换为Date
2021-03-30 22:27:01
这对我有用,谢谢。但是,如果您传递一个数字,例如 0 或 1,它会将其视为有效日期……有什么想法吗?
2021-04-01 22:27:01