Как проверить, является ли строка легальной датой "dd/mm/yyyy"?
С учетом строки str
, как я могу проверить, находится ли она в формате dd/mm/yyyy
и содержит дату регистрации?
Некоторые примеры:
bla bla // false
14/09/2011 // true
09/14/2011 // false
14/9/2011 // false
1/09/2011 // false
14/09/11 // false
14.09.2011 // false
14/00/2011 // false
29/02/2011 // false
14/09/9999 // true
Ответы
Ответ 1
Изменить: точное решение ниже
Вы можете сделать что-то подобное, но с более точным алгоритмом для проверки дня:
function testDate(str) {
var t = str.match(/^(\d{2})\/(\d{2})\/(\d{4})$/);
if(t === null)
return false;
var d = +t[1], m = +t[2], y = +t[3];
// Below should be a more acurate algorithm
if(m >= 1 && m <= 12 && d >= 1 && d <= 31) {
return true;
}
return false;
}
http://jsfiddle.net/aMWtj/
Дата проверки alg.: http://www.eee.hiflyers.co.uk/ProgPrac/DateValidation-algorithm.pdf
Точное решение:, которая возвращает синтаксическую дату или значение null, в зависимости от ваших требований.
function parseDate(str) {
var t = str.match(/^(\d{2})\/(\d{2})\/(\d{4})$/);
if(t !== null){
var d = +t[1], m = +t[2], y = +t[3];
var date = new Date(y, m - 1, d);
if(date.getFullYear() === y && date.getMonth() === m - 1) {
return date;
}
}
return null;
}
http://jsfiddle.net/aMWtj/2/
Если вам нужна функция для возврата true/false и для формата yyyy/mm/dd
function IsValidDate(pText) {
var isValid = false ;
var t = pText.match(/^(\d{4})\/(\d{2})\/(\d{2})$/);
if (t !== null) {
var y = +t[1], m = +t[2], d = +t[3];
var date = new Date(y, m - 1, d);
isValid = (date.getFullYear() === y && date.getMonth() === m - 1) ;
}
return isValid ;
}
Ответ 2
Попробуйте -
var strDate = '12/03/2011';
var dateParts = strDate.split("/");
var date = new Date(dateParts[2], (dateParts[1] - 1) ,dateParts[0]);
Там больше информации в этом вопросе - Строка Parse DateTime в JavaScript (на мой ответ в основном влияет связанный вопрос)
Демо - http://jsfiddle.net/xW2p8/
ИЗМЕНИТЬ
Обновлен ответ, попробуйте -
function isValidDate(strDate) {
if (strDate.length != 10) return false;
var dateParts = strDate.split("/");
var date = new Date(dateParts[2], (dateParts[1] - 1), dateParts[0]);
if (date.getDate() == dateParts[0] && date.getMonth() == (dateParts[1] - 1) && date.getFullYear() == dateParts[2]) {
return true;
}
else return false;
}
Эта функция передает все тестовые примеры. Насколько мне известно, Адам Юрчик хорошо написал ответ, прежде чем исправил свой первоначальный неправильный ответ. Он заслуживает этого.
Демо - http://jsfiddle.net/2r6eX/1/
Ответ 3
вы можете использовать регулярный exp для подтверждения даты.
попробуйте вот так:
re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
if(form.mydate.value != '' && !form.mydate.value.match(re))
//do something here
Примечание: это будет работать только для dd/mm/yyyy
для точного соответствия вашего требования используйте
re = /^\d{2}\/\d{2}\/\d{4}$/;
Ответ 4
Я собираюсь ответить на другой вопрос, так как Миша Морошко уже хорошо ответил: используйте HTML5. То есть, исходя из предположения, что указанные строки возникают, когда пользователь вводит через веб-браузер, я предлагаю, чтобы записи принимались как
<input type = "date" ...
Я понимаю, что не все браузеры, которые, вероятно, будут использоваться, будут интерпретировать "дату" таким образом, чтобы строго соблюдать силу. Разумеется, правильная вещь, безусловно, будет улучшаться с течением времени и может быть достаточно хорошей в конкретном контексте, даже теперь просто для устранения необходимости проверки строки даты после факта.
Ответ 5
Лично я считаю, что лучшим решением будет изменение пользовательского интерфейса для использования выпадающих списков для месяца и, возможно, дневных выборов.
Попытка выяснить, есть ли 1/2/2001 2 января или 1 февраля, основываясь исключительно на этой входной строке, невозможно.
Ответ 6
Недавнее открытие: вы можете использовать date.js lib, добавляет функцию Date.parseExact, чтобы вы могли просто сделать Date.parseExact(dateString,"dd/MM/yyyy")
. Он не работает, когда месяц 00
, но его все еще полезно.
Ответ 7
только для формата dd/mm/yyyy
^(0?[1-9]|[12][0-9]|3[01])[\/](0?[1-9]|1[012])[\/]\d{4}$