Uma das grandes dores de cabeça é a validação de campos date e datetime em javascript.
Existem inúmeras formas de se fazer esta validação. Pode-se usar Expressões Regulares, checar data e hora separados, ou dividir o campo usando máscaras e tentando validar cada parte separadamente.
Eu fiz a seguinte rotina, ela checa datas no formato dd/mm/yyyy hh:nn:ss, para mim funciona, espero que seja útil para alguém. Deixei os alertas para debugar possíveis erros.
function isLeap(theYear) {
if(theYear % 400 == 0){return true;}
if(theYear % 100 == 0){return false;}
if(theYear % 4 == 0){return true;}
return false;
}
function valida_datetime(dt){
alert(‘entrou em valida_datetime. dt=’+dt);
var d=dt.substr(0,2);
var m=dt.substr(3,2);
var y=dt.substr(6,4);
var h=dt.substr(11,2);
var n=dt.substr(14,2);
alert(‘d=’+d+’, m=’+m+’, y=’+y+’, h=’+h+’, n=’+n);
if((isNaN(d))||(isNaN(m))||(isNaN(y))||(isNaN(h))||(isNaN(n))){
alert(‘alguma coisa não é número’);
return false;
}
if ((y<1970)||(y>2100)){
alert(‘ano inválido’);
return false;
}
if ((h<0)||(h>23)){
alert(‘Hora inválida’);
return false;
}
if ((n<0)||(n>59)){
alert(‘Minuto inválido’);
return false;
}
m=parseInt(m);
switch(m){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
alert(‘Mês de 31 dias’);
if((d<0)||(d>31)){
alert(‘Dia do mês inválido 31′);
return false;
}
break;
case 4:
case 6:
case 9:
case 11:
alert(‘Mês de 30 dias’);
if((d<0)||(d>30)){
alert(‘Dia do mês inválido 30′);
return false;
}
break;
case 2:
alert(‘Mês de Fevereiro’);
var nd=28;
if(isLeap(y)){
nd=29;
}
if((d<0)||(d>nd)){
alert(‘Dia do mês inválido 28′);
return false;
}
break;
default:
alert(‘Mês inválido’);
return false;
}
return true;
}
function valida_dados(){
alert(‘entrou aqui’);
var a_data=document.form1.data.value;
alert(’1′);
//formato obrigatório: dd/mm/yyyy hh:nn
if(!valida_datetime(a_data)){
alert(’3′);
alert(‘Campo data inválido!’);
document.form1.data.focus();
alert(’4′);
return false;
}
return true;
}