물체가 날짜인지 확인하는 방법?


601

웹 페이지에 성가신 버그가 있습니다.

date.GetMonth ()는 함수가 아닙니다

그래서 내가 잘못하고 있다고 생각합니다. 변수 date가 유형의 객체가 아닙니다 Date. Javascript에서 데이터 유형을 확인하려면 어떻게합니까? 을 추가하려고 시도했지만 if (date)작동하지 않습니다.

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

따라서 방어 코드를 작성하고 날짜가 아닌 날짜를 지정하지 않으려면 어떻게해야합니까?

감사!

업데이트 : 날짜 형식을 확인하고 싶지 않지만 메소드에 전달 된 매개 변수 getFormatedDate()가 유형 인지 확인하고 싶습니다 Date.


날짜 가 아닌지 여부를 확인해야하는 경우 Invalid Date: stackoverflow.com/a/44198641/5846045
Boghyon Hoffmann

답변:


1109

통해 오리 타이핑의 대안으로

typeof date.getMonth === 'function'

instanceof연산자 를 사용할 수 있습니다. 즉, 유효하지 않은 날짜에 대해서도 true를 반환합니다. 예 new Date('random_string')를 들어 Date의 인스턴스이기도합니다.

date instanceof Date

객체가 프레임 경계를 통과하면 실패합니다.

이에 대한 해결 방법은 다음을 통해 객체의 클래스를 확인하는 것입니다.

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

28
프레임 경계를 통과 할 때 이것이 실패한 이유를 알고 있습니까?
Simon Lieschke

85
@Simon : JS 전역은 현재 전역 객체 (일명 window또는 self)에 로컬입니다 . 서로 다른 프레임에는 자체 전역 객체가 있으며 해당 속성 (예 : 전역)은 Date서로 다른 객체 Date를 나타냅니다. frame1에서 frame2와 다른 함수 객체입니다 . 동일한 사실이다 Date.prototype이유 인 instanceof실패 : Date.prototype프레임 1은 프로토 타입의 체인의 일부가 아닌로부터 Date프레임 2에서 인스턴스
크리스토프

9
크리스토프, "프레임"이란 무엇입니까? IFRAME, FRAMESET의 각 프레임 또는 기타 (HTML이 아닌 JS 관련을 의미 함)?
Paul

12
new Date('something') instanceof DatetrueChrome으로 돌아갑니다 . 그때 작동하지 않습니다.
krillgar

12
날짜 유형 객체 (일반 객체 또는 문자열과 반대)를 감지하고 날짜가 될 것으로 예상되는 객체를 확인하는 작업은 서로 다른 두 가지 작업입니다. 함수에 대한 입력이 여러 가지 다른 데이터 유형 중 하나 일 수있는 상황이 많이 있습니다. 필자의 경우 Date 객체가 유효하다는 것을 신뢰할 수 있습니다 (클라이언트에서 직접 제공되지 않음). stackoverflow.com/questions/1353684/…
Michael Blackburn

125

다음 코드를 사용할 수 있습니다 :

(myvar instanceof Date) // returns true or false

6
이것이 왜 받아 들여 지거나 더 찬란한 대답이 아닌가? 날짜에 .getMonth 속성이 있는지 확인하면 오 탐지가 발생할 수 있습니다.
doremi December

24
instanceof는 잘못된 부정을 유발할 수 있습니다. Christoph의 자신의 답변에 대한 의견을 참조하십시오.
Marco Mariani

2
@doremi 여기에 instanceof부정 부정 을 유발 하는 데모가 있습니다 : jsbin.com/vufufoq/edit?html,js,console
Boghyon Hoffmann

68

값이 표준 JS-date 오브젝트의 유효한 유형인지 확인하기 위해이 술어를 사용할 수 있습니다.

function isValidDate(date) {
  return date && Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date);
}
  1. date파라미터가 아니 었는지 체크 falsy 값 ( undefined, null, 0, "", 등 ..)
  2. Object.prototype.toString.call(date)주어진 객체 유형의 네이티브 문자열 표현 을 반환합니다 "[object Date]". 때문에 date.toString()우선은 부모 방법 , 우리는 필요 .call또는 .apply에서 방법을 Object.prototype직접하는 ..
  3. !isNaN(date)마지막으로 값이 아닌지 여부를 확인합니다 Invalid Date.

1
와우 isNaN를 사용하여 확인할 수 있습니다 Date. 그것은 일부 PHP 수준의 무죄입니다.
Nick

@Nick 날짜는 숫자입니다.
요시야

@Josiah 글쎄, 모든 컨텍스트를 제거하면 타임 스탬프가 있습니다 : typeof Date.now() === "number". 그러나 : typeof new Date() === "object". 보다 현실적으로 날짜는 우주의 시간과 장소입니다.
Nick

39

기능은 getMonth()아닙니다 GetMonth().

어쨌든, 이것을 수행하여 객체에 getMonth 속성이 있는지 확인할 수 있습니다. 반드시 객체가 Date임을 의미하는 것은 아니며 getMonth 속성을 가진 모든 객체입니다.

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

3
호출 가능 여부 확인 :if (date.getMonth && typeof date.getMonth === "function") {...}
Aloso

20

위에 표시된 것처럼 함수를 사용하기 전에 함수가 있는지 확인하는 것이 가장 쉬운 방법 일 것입니다. 함수가 Date있는 객체가 아니라 a 인 경우 실제로 getMonth()다음을 시도하십시오.

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

이 경우 값의 복제본을 Date만들거나 유효하지 않은 날짜를 만듭니다. 그런 다음 새 날짜 값이 유효하지 않은지 확인할 수 있습니다.


1
이것은 나를 위해 일했습니다. 감사합니다. 그러나 0 또는 1과 같은 단일 숫자를 전달하면 유효한 날짜로 간주됩니다.
Ricardo Sanchez

맞습니다, @RicardoSanchez. Object.prototype.toString.call(value) === '[object Date]'숫자가 표시 될 수있는 경우 허용 된 답변 ( ) 을 사용하려고 합니다. 이 답변의 방법은 실제로 value가로 변환 가능한지 여부를 알려줍니다 Date.
44 초

18

모든 유형에 대해 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


8

내가 찾은 가장 좋은 방법은 다음과 같습니다.

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

작동하지 않습니다. 당신의 진정한 선은 실제로 거짓이며 문제는 객체가 날짜 객체인지 확인하는 것입니다.
Clint

1
@jspassov 답변은 문자열이 날짜인지 아닌지에 따라 더 정확합니다. 내가 찾던 것. 감사!!
아난 트

이것은 문자열이 날짜인지 아닌지를 간단히 확인하는 가장 좋은 방법입니다
James Gentes

3

Date 객체와 관련된 기능이 있는지 확인할 수 있습니다.

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

3

모든 해결 방법 대신 다음을 사용할 수 있습니다.

dateVariable = new Date(date);
if (dateVariable == 'Invalid Date') console.log('Invalid Date!');

나는이 핵을 더 잘 발견했다!


2

또한 짧은 형식을 사용할 수 있습니다

function getClass(obj) {
  return {}.toString.call(obj).slice(8, -1);
}
alert( getClass(new Date) ); //Date

또는 이와 같은 것 :

(toString.call(date)) == 'Date'

2

나는 훨씬 간단한 방법을 사용했지만 이것이 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에서는 작동하지 않습니다.


생성자 이름이 "Date"인 사용자 정의 객체 "Date"는 매개 변수에 getMonth속성 이 있는지 확인하는 것만 큼 위험한 개체를 반환 합니다.
Boghyon Hoffmann 2016

2
@boghyon은 이미 사전 정의 된 Javascript 표준 라이브러리의 생성자 이름으로 객체를 만드는 사람이 먼저 모범 사례를 따르지 않는 것처럼 들립니다. lodash를 다운로드 한 다음 자신 만의 lodash 모듈을 만들고 작동하는 것을 기대하는 것과 같습니다.
mjwrazor 2016 년

1

이 함수는 true날짜 또는 false다른 경우 반환 됩니다 .

function isDate(myDate) {
    return myDate.constructor.toString().indexOf("Date") > -1;
} 

1
isDate(new (function AnythingButNotDate(){ })())반환true
Boghyon Hoffmann

1

또 다른 변형 :

Date.prototype.isPrototypeOf(myDateObject)

좋고 짧습니다! 그러나 불행히도, 와 같은 문제가instanceof 있습니다.
Boghyon Hoffmann

@BoghyonHoffmann iFrame의 경우 다음과 같이 보일 수 있습니다. iWindow.Date.prototype.isPrototypeOf(iWindow.date); // true iWindow.date instanceof iWindow.Date; // true
Vadim

1

try / catch를 사용하는 접근법

function getFormatedDate(date = new Date()) {
  try {
    date.toISOString();
  } catch (e) {
    date = new Date();
  }
  return date;
}

console.log(getFormatedDate());
console.log(getFormatedDate('AAAA'));
console.log(getFormatedDate(new Date('AAAA')));
console.log(getFormatedDate(new Date(2018, 2, 10)));


0

실제로 날짜는 유형 Object입니다. 그러나 객체에 getMonth메소드가 있고 호출 가능한지 확인할 수 있습니다 .

function getFormatedDate(date) {
    if (date && date.getMonth && date.getMonth.call) {
       var month = date.getMonth();
    }
}

2
Christoph의 답변이 더 정확합니다. 'call'속성이 있다고해서 반드시 함수라는 의미는 아닙니다!
Chetan Sastry 2012 년

-1

아래 코드를 통해 확인할 수도 있습니다.

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

여기에 이미지 설명을 입력하십시오


의 생성자 function Date() {/*...*/}또한 Date입니다. 즉, 단순히 생성자 함수를 비교하면 오류가 발생하기 쉬우 며 종종 오탐 (false positive)이 발생합니다. stackoverflow.com/a/44198641/5846045
Boghyon Hoffmann

-1

이 답변 에서 영감을 얻은 이 솔루션은 내 경우에 작동합니다 (API에서받은 값이 날짜인지 여부를 확인해야했습니다).

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

이런 식으로 클라이언트 또는 다른 객체에서 나오는 임의의 문자열 인 경우 Date-like 객체인지 확인할 수 있습니다.


-2

당신은 그냥 사용할 수 없습니다

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

1
아니요, 날짜 객체에만 isValid메소드가 있습니다
nikk wong

2
@grumpy @nikkwong 아니오와 아니오. 표준 날짜 개체에는이 없습니다 isValid. moment.js 만이 그러한 API를 가지고 있습니다.
Boghyon Hoffmann 10
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.