28 de Julio, 2006

Comprobar la validez de una fecha

Ya comenté cómo verificar la entrada del usuario empleando expresiones regulares con Javascript. En aquel ejemplo nos asegurábamos de que la fecha proporcionada por el usuario se ajustaba a un patrón (dd/mm/aaaa), pero no comprobábamos que el valor introducido fuera válido. Por ejemplo: 30/02/2006, se ajusta al patrón pero no es una fecha válida.

Si buscamos en Internet seguro que encontramos muchas funciones, largas y elaboradas, que hacen más o menos el complicado trabajo de la comprobación. Ayer se me ocurrió una forma muy fácil de hacerlo, y es empleando el objeto Date y su función setFullYear.

Con dicha función podemos indicar una fecha con el día, el mes y el año como entrada, y si los valores son erróneos, la función dará una aproximación. Así si comprobamos que la fecha creada no es igual a la introducida por el usuario, se ha producido la citada aproximación, y podemos concluir que la fecha indicada por el usuario no es válida.

/* la forma de verificar el formato es la que ya comentamos */
re=/^[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9]$/
if(f.length==0 || !re.exec(f))
{
	alert("La fecha no tiene formato correcto.")
	return
}

/* comprobamos que la fecha es válida */
var d = new Date()
/* la función tiene como entrada: año, mes, día */
d.setFullYear(f.substring(6,10), 
	      f.substring(3,5)-1,
	      f.substring(0,2))

/* ¿el mes del objeto Date es el mes introducido por el usuario?
   OJO: getMonth() devuelve el número de mes del 0 al 11

   ¿el día del objeto Date es el día introducido por el usuario?
   OJO: getDate() devuelve el día del mes */
if(d.getMonth() != f.substring(3,5)-1 
	|| d.getDate() != f.substring(0,2))
{
	alert("Fecha no válida.")
	return
}

Veamos cómo queda:

Fecha:

Es una forma efectiva y cómoda de hacer la comprobación de la validez de la fecha, porque eso de mirar el mes para comprobar que el día está en rango, calcular los casos de años bisiestos para Febrero, etc; es un rollo ;).

Actualización: Resulta que el parseInt no convertía algunas cadenas númericas como se esperaba. La conversión de tipos automática de Javascript vía operadores sí funciona. Gracias a los provadores ;).

Anotación por Juan J. Martínez, clasificada en: javascript, programming, scripting.

Hay 2 comentarios

Gravatar

Porqué 15/06/1945 es válida y 15/08/1945 no es válida?
Me lo explique ;-)

por Felipe, en 2006-07-28 10:32:01

Gravatar

Siempre tocando las bowlings he probado con las fechas mágicas de cal, ni 02/09/1752 es válida ni 03/09/1752.

Si te fijas con un '$cal 9 1752' hay un salto del 2 al 14. Pensé que el 2 validaría mientras que el 3 no, peeero me he equivocado :D.

por r0sk, en 2006-07-28 11:28:06

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: