JavaScript обнаруживает допустимые даты - PullRequest
37 голосов
/ 11 ноября 2011

Возможный дубликат:
Обнаружение & ldquo; неверной даты & rdquo; Экземпляр даты в JavaScript

Я использовал следующее для определения правильной даты:

var text = $('#Date').val();
var date = Date.parse(text);

if (isNaN(date)) {
      // Invalid date
}

Но обнаружил, что Date.parse считает следующие даты действительными (мм / дд / гггг)

  • 2/30/2011
  • 11/31/2011

Любой другой способ обнаружения недействительных дат, когда количество дней превышает общее количество дней в месяце?

ОБНОВЛЕНИЕ: Еще более серьезная проблема заключается в том, что плагин проверки jQuery также не определяет это как недопустимую дату!

РЕШЕНИЕ:

Основываясь на комментариях @ Guffa, я создал следующую функцию для проверки дат:

function validDate(text) {

    var date = Date.parse(text);

    if (isNaN(date)) {
        return false;
    }

    var comp = text.split('/');

    if (comp.length !== 3) {
        return false;
    }

    var m = parseInt(comp[0], 10);
    var d = parseInt(comp[1], 10);
    var y = parseInt(comp[2], 10);
    var date = new Date(y, m - 1, d);
    return (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d);
}

Ответы [ 4 ]

75 голосов
/ 11 ноября 2011

Чтобы проверить, является ли дата действительной, вы можете проанализировать компоненты даты, создать из нее объект Date и проверить, совпадают ли компоненты в данных с проанализированными компонентами.Если вы создаете объект Date из компонентов, выходящих за пределы диапазона, значения будут перетекать в следующий / предыдущий период для создания правильной даты.

Например, new Date(2011,0,42) создаст объект, которыйсодержит дату 2/11/2011 вместо 1/42 / 2011.

Анализируя компоненты вместо полной даты, вы также решите проблему с различными форматами даты.Мой браузер, например, ожидает формат даты, например y-m-d, а не d/m/y.

Пример:

var text = '2/30/2011';
var comp = text.split('/');
var m = parseInt(comp[0], 10);
var d = parseInt(comp[1], 10);
var y = parseInt(comp[2], 10);
var date = new Date(y,m-1,d);
if (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d) {
  alert('Valid date');
} else {
  alert('Invalid date');
}

Демо: http://jsfiddle.net/Guffa/UeQAK/

3 голосов
/ 11 ноября 2011

Если ваш формат даты установлен как M/D/YYYY, вы можете переформатировать проанализированную дату и посмотреть, соответствует ли она вводу:

var d = new Date(Date.parse(str))
return str === (d.getMonth()+1)+'/'+d.getDate()+'/'+d.getYear();

Однако, это не допустит пробелы или ноль-набранные цифры.

Если вам не нужно точно вводить данные пользователя, вы все равно можете просто переформатировать дату и сделать вид, что это было введено.

Но если вы не можете это сделатьчто либо я сам разбираю компоненты с помощью RegExp, а затем сравниваю их со значениями из методов Date.

0 голосов
/ 30 мая 2017

Пример неправильный

правильное значение

if ((month == 4 || month == 6 || month == 9 || month == 11) && day <= 30)

<= вместо =

Но пример великолепен!

0 голосов
/ 11 ноября 2011

Вы могли бы написать скрипт, чтобы сделать это вручную:

function checkDate(day, month) {
   if ((month == 4 || month == 6 || month == 9 || month == 11) && day < 30) {
       alert("Date is valid")
   }
   else if (month == 2 && day <= 28) {
       alert("Date is valid")
   }
   else if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day <= 31) {
       alert("Date is valid")
   }
   else {
       alert("Date is in-valid")
   }
}

Конечно, вам также нужно было бы что-то, чтобы следить за високосными годами, но просто помните, что любой год делится на 4, а не на 100является високосным годом, если первые две цифры года не делятся на 4. Это должно быть легко включить в эту функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...