Как проверить, является ли строка юридической датой" 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
7 ответов
Edit: точное решение ниже
вы можете сделать что-то вроде этого, но с более точным алгоритмом для проверки дня:
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;
}
дата проверки 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;
}
в случае, если вам нужна функция для возврата true / false и для формата гггг/ММ/ДД
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 ;
}
попробуй
var strDate = '12/03/2011';
var dateParts = strDate.split("/");
var date = new Date(dateParts[2], (dateParts[1] - 1) ,dateParts[0]);
в этом вопросе больше информации -синтаксический анализ строки 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;
}
эта функция проходит все тестовые случаи. Насколько мне известно, Адам Юрчик опубликовал точный ответ задолго до того, как я исправил мой первоначальный неправильный ответ. Он заслуживает похвалы за это.
вы можете использовать обычный 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}$/;
Я собираюсь ответить на другой вопрос, так как Миша Морошко уже получил хороший ответ: используйте HTML5. То есть, исходя из предположения, что рассматриваемые строки возникают как пользовательские входы через веб-браузер, я предлагаю, чтобы записи были получены как
<input type = "date" ...
Я признаю, что не все браузеры, вероятно, будут использоваться, будут интерпретировать "дату" таким образом, чтобы строго обеспечивать действительность. Это правильная вещь, хотя, безусловно, улучшится с течением времени, и вполне может будьте достаточно хороши в определенном контексте даже сейчас, чтобы просто устранить необходимость проверки строки даты после факта.
лично я думаю, что лучшим решением было бы изменить пользовательский интерфейс, чтобы использовать выпадающие списки для выбора месяца и, возможно, дня.
попытка выяснить, является ли 1/2/2001 2 января или 1 февраля, основываясь только на этой входной строке, невозможна.
недавнее открытие: можно использовать дата.js lib, он добавляет функцию дата.метод parseexact так что вы можете просто сделать Date.parseExact(dateString,"dd/MM/yyyy")
. Он терпит неудачу, когда месяц 00
, но это все еще полезно.