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


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.