Foros del Web » Programando para Internet » Javascript »

Validar una fecha. No me lo puedo creer debe ser sencillo

Estas en el tema de Validar una fecha. No me lo puedo creer debe ser sencillo en el foro de Javascript en Foros del Web. Hola a todos, hace poco que me pego con Java, y mi problema es que quiero validar una fecha. Trabajo con asp, pero las validaciones ...
  #1 (permalink)  
Antiguo 18/04/2005, 10:45
 
Fecha de Ingreso: diciembre-2004
Mensajes: 44
Antigüedad: 19 años, 5 meses
Puntos: 0
Validar una fecha. No me lo puedo creer debe ser sencillo

Hola a todos, hace poco que me pego con Java, y mi problema es que quiero validar una fecha. Trabajo con asp, pero las validaciones las hago en funciones Javascript. Entonces tengo una fecha que la pongo en tres campos distintos, txt_dia, txt_mes, txt_anio, de tamaño 2,2, y 4, cuando se pulsa un botón se va a la función de validar.

Que estén vacias ya lo sé validar, pero me faltaria unir las variables y preguntar simplemente si es una fecha. Como por ej: Isdate(fecha).

Pero en Java no encuentro nada similar, ¿Porfa alguien sabe como validar una fecha en una única instruccion?, ¿es posible?..

Muchas gracias.
  #2 (permalink)  
Antiguo 20/04/2005, 13:10
 
Fecha de Ingreso: octubre-2004
Ubicación: España
Mensajes: 894
Antigüedad: 19 años, 6 meses
Puntos: 3
Hola, gaspampera
Es cuestión de ir poco a poco. Por ejemplo, esta es una solución casera:
Código PHP:
function esFecha(formu)
{    var 
datoFecha=[formu.txt_dia.value,formu.txt_mes.value,formu.txt_anio.value]
    var 
datoMax=[31,12,3000]
    for (var 
i=0i<3i++)
    {    
//que sean números enteros:
        
if ( parseInt(datoFecha[i]) != datoFecha[i] ) return false
        
//que sean positivos no nulos:
        
if ( datoFecha[i] <= ) return false
        
//que sean valores válidos:
        
if ( datoFecha[i] > datoMax[i] ) return false
    
}
       return 
true

Y la llamas con
Código HTML:
<form>
<input type="text" name="txt_dia">/
<input type="text" name="txt_mes">/
<input type="text" name="txt_anio">
<input type="button" value="Validar fecha" onClick="alert(esFecha(this.form))">
</form> 
Para el año habrá que afinar más, pero espero que captes la idea.
Supongo que se podrá hacer mejor usando objetos date(), pero por ahora no sé exactamente cómo. Eso permitiria verificar que realmente es una fecha correcta (por ej., no el 30 de febrero o el 31 de abril).
__________________
Angel :cool:
  #3 (permalink)  
Antiguo 20/04/2005, 13:23
Avatar de phpec  
Fecha de Ingreso: noviembre-2004
Mensajes: 70
Antigüedad: 19 años, 5 meses
Puntos: 0
otra mejor

la función anterior falla en caso de que escriban 2 digitos en el dia y en el mes pero aun mas importante en dias inexistentes como 31 de septiembre , de febrero ...etc.....

mira esta función ..
function esDigito(sChr){
var sCod = sChr.charCodeAt(0);
return ((sCod > 47) && (sCod < 58));
}

function valSep(oTxt){
var bOk = false;
var sep1 = oTxt.value.charAt(2);
var sep2 = oTxt.value.charAt(5);
bOk = bOk || ((sep1 == "-") && (sep2 == "-"));
bOk = bOk || ((sep1 == "/") && (sep2 == "/"));
return bOk;
}

function finMes(oTxt){
var nMes = parseInt(oTxt.value.substr(3, 2), 10);
var nAno = parseInt(oTxt.value.substr(6), 10);
var nRes = 0;
switch (nMes){
case 1: nRes = 31; break;
case 2: nRes = 28; break;
case 3: nRes = 31; break;
case 4: nRes = 30; break;
case 5: nRes = 31; break;
case 6: nRes = 30; break;
case 7: nRes = 31; break;
case 8: nRes = 31; break;
case 9: nRes = 30; break;
case 10: nRes = 31; break;
case 11: nRes = 30; break;
case 12: nRes = 31; break;
}
return nRes + (((nMes == 2) && (nAno % 4) == 0)? 1: 0);
}

function valDia(oTxt){
var bOk = false;
var nDia = parseInt(oTxt.value.substr(0, 2), 10);
bOk = bOk || ((nDia >= 1) && (nDia <= finMes(oTxt)));
return bOk;
}

function valMes(oTxt){
var bOk = false;
var nMes = parseInt(oTxt.value.substr(3, 2), 10);
bOk = bOk || ((nMes >= 1) && (nMes <= 12));
return bOk;
}

function valAno(oTxt){
var bOk = true;
var nAno = oTxt.value.substr(6);
bOk = bOk && ((nAno.length == 2) || (nAno.length == 4));
if (bOk){
for (var i = 0; i < nAno.length; i++){
bOk = bOk && esDigito(nAno.charAt(i));
}
}
return bOk;
}

function valFecha(oTxt){
var bOk = true;
if (oTxt.value != ""){
bOk = bOk && (valAno(oTxt));
bOk = bOk && (valMes(oTxt));
bOk = bOk && (valDia(oTxt));
bOk = bOk && (valSep(oTxt));
if (!bOk){
alert("Fecha inválida");
oTxt.value = "";
oTxt.focus();
} else alert("Fecha correcta");
}
}



<form name="frm">
Escriba fecha (dd/mm/aaaa):
<input type="text" size="10" name="fec">
<br>
<input type="button" value="Validar"

onclick="valFecha(document.frm.fec)">
</form>




funciona con un solo campo...parte la cadena

la puedes modificar para que introduscan los campos por separado

Saludos
  #4 (permalink)  
Antiguo 20/04/2005, 13:29
 
Fecha de Ingreso: octubre-2004
Ubicación: España
Mensajes: 894
Antigüedad: 19 años, 6 meses
Puntos: 3
otra solución

He estado trasteando un poco con el objeto date() y creo que lo he conseguido:
Código PHP:
function esFecha(formu)
{
    var 
elDia=formu.txt_dia.value
    
var elMes=formu.txt_mes.value-1
    
var elAnio=formu.txt_anio.value
    
var ff = new Date(elAnioelMeselDia)
    if ( 
ff.getDate() != elDia ) return false
    
if ( ff.getMonth() != elMes ) return false
    
if ( ff.getFullYear() != elAnio ) return false
    
return true

Al usar el propio objeto de javascript él se encarga de verificar que la fecha es real (si, por ejemplo, metes 31 de abril, él lo convierte en 1 de mayo, con lo cual al comparar da desigual).
También parece que acepta indistintamente valores de 1 dígito o 2.
Pruébalo a ver si en efecto es "a prueba de bomba", pero me parece que así es.
¡Suerte!
__________________
Angel :cool:
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:59.