当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何检查对象是否为日期?》经验,为你挑选了8个好方法。

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

date.GetMonth()不是函数

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

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

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

谢谢!

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



1> Christoph..:

作为鸭子打字的替代品

typeof date.getMonth === 'function'

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

date instanceof Date

如果对象跨帧边界传递,则会失败.

解决方法是通过检查对象的类

Object.prototype.toString.call(date) === '[object Date]'


@Simon:JS全局变量是当前全局对象的本地对象(又名`window`或`self`); 不同的帧有自己的全局对象,它们的属性(即全局变量)引用不同的对象:frame1中的`Date`是与frame2中的`Date`不同的函数对象; `Date.prototype`也是如此,这是`instanceof`失败的原因:来自frame1的`Date.prototype`不是来自frame2的`Date`实例的原型链的一部分
出于兴趣,您是否知道在跨越框架边界时失败的原因?
`new Date('something')instanceof Date`在Chrome中返回`true`.那不行.
检测Date类型对象(与普通对象或字符串相对)并验证您期望为Date的对象是两个不同的任务.在许多情况下,函数的输入可能是许多不同数据类型之一.在我的情况下,我可以相信我得到的任何Date对象都是有效的(它不是直接来自客户端)如果验证是一个问题,这里有一个包含许多选项的帖子.http://stackoverflow.com/questions/1353684/detecting-an-invalid-date-date-instance-in-javascript?rq=1
克里斯托夫,你怎么称呼"框架"?IFRAME,FRAMESET中的每一帧或其他东西(我的意思是JS特定的,而不是HTML的东西)?
`Object.prototype.toString.call(new Date('invalid_date'))==='[object Date]'`仍然返回`true`
有关跨越帧边界失败的`instanceof`方法的详细说明,请参阅[JavaScript Garden](http://bonsaiden.github.com/JavaScript-Garden/#types.instanceof):"...`instanceof`不起作用源自不同JavaScript上下文的对象(例如Web浏览器中的不同文档),因为它们的构造函数不是完全相同的对象."
@Paul,每个HTML`frame` /`iframe`都有自己的JS上下文,因此也有自己的`Date`对象。您可以在[`window.frames`](https://developer.mozilla.org/en-US/docs/Web/API/Window.frames)集合中找到所有框架,并通过`window找到相应的Date对象。 .frames [i] .window.Date`。例如,尝试`window.frames [0] .window.Date ==日期`
@Kian,因为`date.setUTCHours(0)`不返回日期对象.它返回自UTC 1/1/1900 00:00:00 UTC以来的毫秒数.该值是一个数字,因此`date.setUTCHours(0)instanceof Date`将为false.

2> 小智..:

您可以使用以下代码:

(myvar instanceof Date) // returns true or false


instanceof可以触发假阴性,请参阅Christoph对自己答案的评论.
为什么这不是被接受或更受欢迎的答案?只需检查日期是否具有.getMonth属性就可能触发误报.

3> Boghyon Hoff..:

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

function isValidDate(date) {
  return date && Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date);
}

    date检查是否参数不是一个falsy值(undefined,null,0,""等.)

    Object.prototype.toString.call(date)返回给定对象类型的本地字符串表示形式 - 在我们的示例中"[object Date]".因为date.toString()重写它的父方法,我们需要.call或直接.applyObject.prototype哪个方法...

    绕过具有相同构造函数名称的用户定义的对象类型(例如:"Date")

    instanceof或相反,在不同的JS上下文(例如iframe)中工作Date.prototype.isPrototypeOf.

    !isNaN(date)最后检查价值是否不是Invalid Date.


这应该标记为答案.完善.

4> Chetan Sastr..:

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

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

if (date.getMonth) {
    var month = date.getMonth();
}


检查它是否可调用:`if(date.getMonth && typeof date.getMonth ===“ function”){...}

5> bdukes..:

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

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

如果它是a Date,则会创建值的克隆,或创建无效日期.然后,您可以检查新日期的值是否无效.



6> KooiInc..:

对于所有类型我都编写了一个Object原型函数.它可能对你有用

Object.prototype.typof = function(chkType){
      var inp        = String(this.constructor),
          customObj  = (inp.split(/\({1}/))[0].replace(/^\n/,'').substr(9),
          regularObj = Object.prototype.toString.apply(this),
          thisType   = regularObj.toLowerCase()
                        .match(new RegExp(customObj.toLowerCase()))
                       ? regularObj : '[object '+customObj+']';
     return chkType
            ? thisType.toLowerCase().match(chkType.toLowerCase()) 
               ? true : false
            : thisType;
}

现在你可以检查这样的任何类型:

var myDate     = new Date().toString(),
    myRealDate = new Date();
if (myRealDate.typof('Date')) { /* do things */ }
alert( myDate.typof() ); //=> String

[ 编辑2013年3月 ]基于进步的洞察力,这是一个更好的方法:

Object.prototype.is = function() {
        var test = arguments.length ? [].slice.call(arguments) : null
           ,self = this.constructor;
        return test ? !!(test.filter(function(a){return a === self}).length)
               : (this.constructor.name ||
                  (String(self).match ( /^function\s*([^\s(]+)/im)
                    || [0,'ANONYMOUS_CONSTRUCTOR']) [1] );
}
// usage
var Some = function(){ /* ... */}
   ,Other = function(){ /* ... */}
   ,some = new Some;
2..is(String,Function,RegExp);        //=> false
2..is(String,Function,Number,RegExp); //=> true
'hello'.is(String);                   //=> true
'hello'.is();                         //-> String
/[a-z]/i.is();                        //-> RegExp
some.is();                            //=> 'ANONYMOUS_CONSTRUCTOR'
some.is(Other);                       //=> false
some.is(Some);                        //=> true
// note: you can't use this for NaN (NaN === Number)
(+'ab2').is(Number);                 //=> true



7> avalanche1..:

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



8> jspassov..:

我发现的最好方法是:

!isNaN(Date.parse("some date test"))
//
!isNaN(Date.parse("22/05/2001"))  // true
!isNaN(Date.parse("blabla"))  // false

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有