2014-01-17 8 views
6

Я пытаюсь написать код, который будет проверять данные формы. У меня есть поле даты, которое должно иметь формат mm/dd/yyyy. Мне нужно перехватывать исключения, такие как февраля, поэтому я добавил этот код:javascript date validation not validation 31 февраля

var d = new Date(dob); 
if (isNaN(d.getTime())) { //this if is to take care of February 31, BUT IT DOESN'T! 
    error = 1; 
    message += "<li>Invalid Date</li>"; 
} else { 
    var date_regex = /^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/; 
    var validFormat = date_regex.test(dob); 
    if (!(validFormat)) { 
    error = 1; 
    message += "<li>Invalid date format - date must have format mm/dd/yyyy</li>"; 
    } 
} 

Однако я нашел что-то очень странное: в то время как даты 02/32/2000 ошибки как недействительный дату, 02/31/2000 нет!

+1

'новые Дата (' 2013-02-31 00: 00:00 ') 'на самом деле оценивает' Sun Mar 03 2013 00:00:00 GMT-0500 (Восточное стандартное время) ', поэтому это не ошибка. Не 100% уверены в причине этого, хотя –

+0

Это произойдет за каждый месяц с менее чем за 31 день ... – Christoph

ответ

18

Из-за того, что я сказал в комментариях ...

Другим способом вы можете проверить, если дата является действительным, проверяя, является ли материал, который Вы перешли в функции new Date такое же, как то, что выходит из него, как это:

// Remember that the month is 0-based so February is actually 1... 
function isValidDate(year, month, day) { 
    var d = new Date(year, month, day); 
    if (d.getFullYear() == year && d.getMonth() == month && d.getDate() == day) { 
     return true; 
    } 
    return false; 
} 

, то вы можете сделать это:

if (isValidDate(2013,1,31)) 

и вернется true если действительный и false если недействителен.

+1

Ницца, просто измените '== date' за' == day' – Eldelshell

0

Вы можете использовать библиотеку?

Мой первый порт захода на обработку данных в Javascript - moment.js: «Библиотека дат javascript для синтаксического анализа, проверки, управления и форматирования дат».

1

Способ передачи данных для подтверждения строки даты «mm/dd/yyyy» заключается в создании объекта даты и проверки того, что его месяц и дата совпадают с вводом.

function isvalid_mdy(s){ 
    var day, A= s.match(/[1-9][\d]*/g); 
    try{ 
     A[0]-= 1; 
     day= new Date(+A[2], A[0], +A[1]); 
     if(day.getMonth()== A[0] && day.getDate()== A[1]) return day; 
     throw new Error('Bad Date '); 
    } 
    catch(er){ 
     return er.message; 
    } 
} 

isvalid_mdy ('02/31/2000 ')

/* Возвращаемое значение: (ошибка) Bad Дата */