JavaScript Определение действующих дат
Возможный дубликат:
Обнаружение экземпляра даты "недействительной даты" в JavaScript
Я использовал следующее для определения допустимой даты:
var text = $('#Date').val();
var date = Date.parse(text);
if (isNaN(date)) {
// Invalid date
}
Но обнаружил, что Date.parse считает следующие допустимые даты (mm/dd/yyyy)
Любой другой способ обнаружения недопустимых дат, когда количество дней превышает общее количество
дней в месяце?
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);
}
Ответы
Ответ 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)
<=
вместо =
Но пример отличный!