9

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

6

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

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

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

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

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

Спасибо!

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

5 ответ(ов)

0

Функция называется getMonth(), а не GetMonth().

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

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

Это довольно простой подход, если вас не беспокоят iframe и другие контексты.

// isNaN(Invalid Date) == true
if (date instanceof Date && !isNaN(date)) { // isNaN не принимает дату в TypeScript, используйте date.getTime(), чтобы получить число
    console.log("это дата!");
}
  • Проверяет, что объект действительно является Date, а не чем-то, что похоже на него. Любой объект может иметь функцию getMonth.
  • Убедитесь, что дата не является Invalid Date.
  • Не передает значение в new Date(), где число или даже строка могут быть преобразованы в дату.

Если вам нужно поддерживать iframe и разные контексты, вы можете использовать ответ, который принято считать правильным, но добавьте дополнительную проверку для идентификации недопустимых дат.

// isNaN(Invalid Date) == true
if (Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date)) {
    console.log("это дата!");
}

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

0

Ваш вопрос касается создания функции для проверки типов объектов в JavaScript. Я разработал метод для объекта 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')) { /* выполняем действия */ }
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]);
}

// использование
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
// заметка: вы не можете использовать это для NaN (NaN === Number)
(+'ab2').is(Number);                     // => true

Этот новый метод is позволяет удобно проверять, на какой класс принадлежит объект, и возвращает имя конструктора или 'ANONYMOUS_CONSTRUCTOR' для анонимных функций. Надеюсь, это будет вам полезно!

0

Наилучший способ, который я нашел, выглядит следующим образом:

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

Этот код использует метод Date.parse() для проверки, является ли строка допустимой датой. Если строка может быть преобразована в дату, Date.parse() вернет время в миллисекундах (число), и isNaN() вернет false. В противном случае будет возвращено значение NaN, и isNaN() вернет true. Таким образом, вы сможете определить, является ли ваша строка действительной датой или нет.

0

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

dateVariable = new Date(date);
if (dateVariable.toString() === 'Invalid Date') console.log('Некорректная дата!');

Я нашел этот хак лучше!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь