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

JavaScript Определение действующих дат

Возможный дубликат:
Обнаружение экземпляра даты "недействительной даты" в JavaScript

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

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

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

Но обнаружил, что Date.parse считает следующие допустимые даты (mm/dd/yyyy)

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

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

UPDATE: Еще большая проблема заключается в том, что плагин проверки 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);
}
4b9b3361

Ответ 1

Чтобы проверить, действительна ли дата, вы можете проанализировать компоненты даты, создать из нее объект 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/

Ответ 2

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

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

Однако это не будет допускать пробельные или нулевые номера.

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

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

Ответ 3

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

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. Это должно легко включить в эту функцию.

Ответ 4

Неверный пример

правильный

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

<= вместо =

Но пример отличный!