Programing

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

lottogame 2020. 2. 12. 07:58
반응형

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


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

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

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

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

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

감사!

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


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

typeof date.getMonth === 'function'

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

date instanceof Date

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

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

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

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

(myvar instanceof Date) // returns true or false

값이 표준 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.

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

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

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

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

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

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


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

UnderscoreJSLodash 에는 .isDate()정확히 필요한 것으로 보이는 함수 가 있습니다. Lodash isDate , UnderscoreJs : 각각의 구현을 살펴볼 가치가 있습니다.


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

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

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

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

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

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

또는 이와 같은 것 :

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

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


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

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

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

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

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


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

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

또 다른 변형 :

Date.prototype.isPrototypeOf(myDateObject)

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)));


당신은 단지 사용할 수 없습니다

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

참고 URL : https://stackoverflow.com/questions/643782/how-to-check-whether-an-object-is-a-date



반응형