Обнаружение «недопустимой даты» экземпляра Date в JavaScript - PullRequest
1284 голосов
/ 30 августа 2009

Я бы хотел сказать разницу между действительными и недействительными объектами даты в JS, но не мог понять, как:

var d = new Date("foo");
console.log(d.toString()); // shows 'Invalid Date'
console.log(typeof d); // shows 'object'
console.log(d instanceof Date); // shows 'true'

Есть идеи по написанию функции isValidDate?

  • Пепел рекомендуется Date.parse для разбора строк даты, что дает авторитетный способ проверить, является ли строка даты действительной.
  • Что бы я предпочел, если это возможно, это чтобы мой API принимал экземпляр Date и мог проверить / подтвердить, действителен ли он или нет. Решение Borgar делает это, но мне нужно протестировать его в разных браузерах. Мне также интересно, есть ли более элегантный способ.
  • Эш заставил меня задуматься о том, чтобы мой API вообще не принимал Date экземпляров, это будет проще всего проверить.
  • Боргар предложил проверить экземпляр Date, а затем проверить значение времени Date. Если дата недействительна, значение времени равно NaN. Я проверил с ECMA-262 , и это поведение в стандарте, что именно то, что я ищу.

Ответы [ 40 ]

12 голосов
/ 11 мая 2017

Здесь уже слишком много сложных ответов, но достаточно простой строки (ES5):

Date.prototype.isValid = function (d) { return !isNaN(Date.parse(d)) } ;

или даже в ES6:

Date.prototype.isValid = d => !isNaN(Date.parse(d));
12 голосов
/ 14 мая 2012

вы можете проверить действительный формат txDate.value с этой scirpt. если он был в неправильном формате, объект Date не был создан и возвращал ноль в dt.

 var dt = new Date(txtDate.value)
 if (isNaN(dt))

И как @ MiF предлагает кратко

 if(isNaN(new Date(...)))
9 голосов
/ 18 сентября 2015

Для проектов Angular.js вы можете использовать:

angular.isDate(myDate);
9 голосов
/ 03 мая 2011

Отличное решение! Включено в мою библиотеку вспомогательных функций, теперь это выглядит так:

Object.isDate = function(obj) {
/// <summary>
/// Determines if the passed object is an instance of Date.
/// </summary>
/// <param name="obj">The object to test.</param>

    return Object.prototype.toString.call(obj) === '[object Date]';
}

Object.isValidDate = function(obj) {
/// <summary>
/// Determines if the passed object is a Date object, containing an actual date.
/// </summary>
/// <param name="obj">The object to test.</param>

    return Object.isDate(obj) && !isNaN(obj.getTime());
}
7 голосов
/ 06 января 2014

Это просто сработало для меня

new Date('foo') == 'Invalid Date'; //is true

Однако это не сработало

new Date('foo') === 'Invalid Date'; //is false
6 голосов
/ 09 сентября 2012

Ни один из этих ответов не сработал для меня (проверено в Safari 6.0) при попытке проверить дату, такую ​​как 31.02.2012, однако они отлично работают при попытке установить любую дату, превышающую 31.

Так что мне пришлось немного переборщить. Предполагая, что дата в формате mm/dd/yyyy. Я использую ответ @broox:

Date.prototype.valid = function() {
    return isFinite(this);
}    

function validStringDate(value){
    var d = new Date(value);
    return d.valid() && value.split('/')[0] == (d.getMonth()+1);
}

validStringDate("2/29/2012"); // true (leap year)
validStringDate("2/29/2013"); // false
validStringDate("2/30/2012"); // false
5 голосов
/ 31 августа 2012

Ни одно из вышеперечисленных решений не помогло мне, но работало, но

function validDate (d) {
        var date = new Date(d);
        var day = ""+date.getDate();
        if( day.length == 1)day = "0"+day;
        var month = "" +( date.getMonth() + 1);
        if( month.length == 1)month = "0"+month;
        var year = "" + date.getFullYear();

        return ((month + "/" + day + "/" + year) == d);
    }

приведенный выше код увидит, когда JS делает 31.02.2012 в 03.02.2012, что он недействителен

5 голосов
/ 14 сентября 2012
IsValidDate: function(date) {
        var regex = /\d{1,2}\/\d{1,2}\/\d{4}/;
        if (!regex.test(date)) return false;
        var day = Number(date.split("/")[1]);
        date = new Date(date);
        if (date && date.getDate() != day) return false;
        return true;
}
4 голосов
/ 25 февраля 2014

Я написал эту функцию. Передайте ему строковый параметр, и он будет определять, является ли это действительной датой или нет, основываясь на этом формате «дд / мм / гггг».

вот тест

ввод: "хахаха", вывод: false.

вход: "29/2/2000", выход: true.

ввод: "29/2/2001", вывод: false.

function isValidDate(str) {
    var parts = str.split('/');
    if (parts.length < 3)
        return false;
    else {
        var day = parseInt(parts[0]);
        var month = parseInt(parts[1]);
        var year = parseInt(parts[2]);
        if (isNaN(day) || isNaN(month) || isNaN(year)) {
            return false;
        }
        if (day < 1 || year < 1)
            return false;
        if(month>12||month<1)
            return false;
        if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day > 31)
            return false;
        if ((month == 4 || month == 6 || month == 9 || month == 11 ) && day > 30)
            return false;
        if (month == 2) {
            if (((year % 4) == 0 && (year % 100) != 0) || ((year % 400) == 0 && (year % 100) == 0)) {
                if (day > 29)
                    return false;
            } else {
                if (day > 28)
                    return false;
            }      
        }
        return true;
    }
}
3 голосов
/ 18 августа 2011

Вдохновленный подходом Боргара, я позаботился о том, чтобы код не только проверял дату, но и фактически проверял, чтобы дата была реальной, то есть такие даты, как 31/09/2011 и 29/02/2011, недопустимы.

function(dateStr) {
    s = dateStr.split('/');
    d = new Date(+s[2], s[1]-1, +s[0]);
    if (Object.prototype.toString.call(d) === "[object Date]") {
        if (!isNaN(d.getTime()) && d.getDate() == s[0] && 
            d.getMonth() == (s[1] - 1)) {
            return true;
        }
    }
    return "Invalid date!";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...