javascript Date создает странную дату, когда дни больше, чем в месяце

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

функция validateDate() вызывается, когда пользователь выходит из поля ввода

    //Make sure valid date is entered into the field, otherwise throw back an error
function validateDate(date) {
    var dateObj = new Date(date);

    console.log(dateObj.getDate());

    if (dateObj == "Invalid Date") {
        dateWrongFormat(false);
        return false;
    }

    return dateTimeToString(dateObj, true);
}

Проблема в следующем: скажем, если пользователь случайно вводит что-то вроде «55/02/2014», оно преобразуется в «02 июля 2018» вместо отображения недопустимой даты (примечание: это 4 года после года, который они ввели) .

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

РЕДАКТИРОВАТЬ: поэтому кажется, что независимо от того, что я набираю, он считает, что это действительная дата - даже форматирование с помощью moment.js. Спасибо за помощь, ребята, но я должен написать свой собственный для этого!


person ChiMo    schedule 20.03.2015    source источник
comment
Это разработанное поведение для даты. Ознакомьтесь с документацией MSD, developer.mozilla.org/en -US/docs/Web/JavaScript/Справочник/   -  person Salizar Marxx    schedule 20.03.2015


Ответы (3)


Попробуйте использовать Date.parse. Если вы делаете Date.parse("55/02/2014"), он возвращает NaN.

ОБНОВЛЕНИЕ Что-то вроде этого-

 <script>
    function validateDate(date) {
        var datems = Date.parse(date);

        if (isNaN(datems)) {
            dateWrongFormat(false);
            return false;
        }else{
        var dateObj = new Date(date);
        return dateTimeToString(dateObj, true);
        }
    }

    </script>
person Isaac Ray    schedule 20.03.2015
comment
простой и встроенный, что может быть лучше? - person dandavis; 20.03.2015
comment
Хм, похоже, это не работает - во всяком случае, это просто дает мне миллисекундный формат. - person ChiMo; 20.03.2015
comment
Спасибо за ответ, Исаак, но все, что я делаю, отказывается работать и указывает дату как действительную. Клиент «очень специфичен» в отношении того, как он хочет, чтобы он работал, поэтому я собираюсь реализовать свои собственные методы проверки, поскольку он также, похоже, преобразует YY «15» в «1915». :) - person ChiMo; 20.03.2015

Если вы работаете с датами, вам может пригодиться MomentJS.

В частности, если вы создаете экземпляр момента из строки, вы можете затем спросить его, действителен ли он:

moment('55/02/2014').isValid(); // returns false
person GregL    schedule 20.03.2015

Пытаться:

function validateDate(date) {
//Format = dd/mm/yyyy
var day=date.split("/")[0];
var month=date.split("/")[1];
var year=date.split("/")[2];
var dateObj = new Date(year, month-1, day);

console.log(dateObj.getDate());

 if ((dateObj .getMonth()+1!=month)||(dateObj .getDate()!=day)||(dateObj .getFullYear()!=year)) {
        dateWrongFormat(false);
        return false;
    }

    return dateTimeToString(dateObj, true);
}
person fedear    schedule 20.03.2015