Подтвердить что ты не робот

Как проверить, является ли объект датой?

У меня есть раздражающая ошибка на веб-странице:

date.GetMonth() не является функцией

Итак, я полагаю, что я делаю что-то не так. Переменная date не является объектом типа Date. Как я могу проверить тип данных в Javascript? Я пытался добавить if (date), но он не работает.

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

Итак, если я хочу написать защитный код и предотвратить форматирование даты (не одной), как мне это сделать?

Спасибо!

ОБНОВЛЕНИЕ: Я не хочу проверять формат даты, но хочу убедиться, что параметр, переданный методу getFormatedDate(), имеет тип Date.

4b9b3361

Ответ 1

В качестве альтернативы печатанию утки с помощью

typeof date.getMonth === 'function'

вы можете использовать оператор instanceof, т.е. но он вернет true и для неверных дат, например. new Date('random_string') также является экземпляром Date

date instanceof Date

Это произойдет, если объекты передаются через границы фрейма.

Обход для этого - проверка класса объекта с помощью

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

Ответ 2

Вы можете использовать следующий код:

(myvar instanceof Date) // returns true or false

Ответ 3

Чтобы проверить, является ли значение допустимым типом стандартного объекта JS-date, вы можете использовать этот предикат:

function isValidDate(date) {
  return date && Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date);
}
  1. date проверяет, не является ли параметр ложным значением (undefined, null, 0, "" и т.д.)
  2. Object.prototype.toString.call(date) возвращает собственное строковое представление данного типа объекта - в нашем случае "[object Date]". Поскольку date.toString() переопределяет его родительский метод, нам нужно .call или .apply метод из Object.prototype напрямую, который..
    • Обходит определенный пользователем тип объекта с тем же именем конструктора (например, "Дата")
    • Работает в разных контекстах JS (например, в фреймах) в отличие от instanceof или Date.prototype.isPrototypeOf.
  3. !isNaN(date) окончательно проверяет, не было ли значение Invalid Date.

Ответ 4

Функция getMonth(), а не getMonth().

В любом случае, вы можете проверить, обладает ли объект свойством getMonth, выполнив это. Это не обязательно означает, что объект является Датой, просто любым объектом, обладающим свойством getMonth.

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

Ответ 5

Как указано выше, вероятно, проще всего проверить, существует ли функция перед ее использованием. Если вам действительно интересно, что это Date, а не только объект с функцией getMonth(), попробуйте следующее:

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

Это создаст либо клон значения, если он Date, либо создаст недопустимую дату. Затем вы можете проверить, недействительно ли новое значение даты или нет.

Ответ 6

Для всех типов я создал функцию прототипа объекта. Он может быть вам полезен

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] на основе прогрессивного понимания, это лучший метод:

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

UnderscoreJS и Lodash имеют функцию под названием .isDate(), которая, кажется, именно то, что вам нужно. Стоит посмотреть на их соответствующие реализации: Lodash isDate, UnderscoreJs

Ответ 8

Лучший способ найти:

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

Ответ 9

Вы можете проверить, существует ли функция, специфичная для объекта Date:

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

Ответ 10

Также вы можете использовать короткую форму

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

или что-то вроде этого:

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

Ответ 11

Я использую гораздо более простой способ, но не уверен, что это доступно только в 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, поскольку у них нет конструктора.

Ответ 12

Эта функция вернет true, если это Date или false иначе:

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

Ответ 13

Вместо всех обходных путей вы можете использовать следующее:

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

Я нашел этот взлом лучше!

Ответ 14

Фактически дата будет иметь тип Object. Но вы можете проверить, имеет ли объект метод getMonth, и если он доступен для вызова.

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

Ответ 15

Еще один вариант:

Date.prototype.isPrototypeOf(myDateObject)

Ответ 16

Подход с использованием 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)));

Ответ 17

Не могли бы вы просто использовать

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