October 19th, 2009

Problema: Validar fechas Javascript/Cambio de hora

programacion, by admin.

Mas de alguno tiene una función que valida una fecha en javascript y lo principal que se quiere conseguir es que el usuario final no digite una fecha invalida(Ej: 31 de Febrero). Para esto se utiliza el objeto Date de javascript, en una forma similar a esta:

1
2
3
4
5
6
/*
* Date(AÑO, MES, DIA)
* Notese que el mes esta escrito con -1,
* esto es porque el objeto toma los meses del 0 al 11
*/

var miFecha = new Date(2009,(10-1),19);

Pues bueno, siguiendo con el tema, la mayoria de las funciones que encontré en internet funcionan de la siguiente manera:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function validafecha(value) {
    var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
    // Valida el formato
    if( re.test(value)){
        var adata = value.split('/');//Separa dia, mes y año
        var gg = parseInt(adata[0],10);//pasa el dia a una variable
        var mm = parseInt(adata[1],10);//el mes a una variable
        var aaaa = parseInt(adata[2],10);//el año a una variable
        var fdata = new Date(aaaa,(mm-1),gg);//Genera la fecha con los datos ingresados
        /**
         * Comienza la validacion:
         * Primero valida que el año del objeto sea igual al entero que se digitó
         * Segundo valida que el numero del mes del objeto, sea igual al entero que se digitó - 1
         * Tercero, valida que el día del objeto sea igual al entero que se digitó
         */

        if( ( fdata.getFullYear() == aaaa ) && ( fdata.getMonth() == (mm-1) ) && (fdata.getDate() == gg) )
            return true;
        else
            return false;
    }else{
        return check;
    }
}

Esto funciona bien hasta que… se cambia el horario del verano y en especifico para el siguiente. Es decir, el momento en que se cambia un día sábado 10 al domingo 11. Por tanto, si digitamos la fecha 11/10/2009 y si, y solo si, nuestro computador tiene una correcta zona horaria con cambio automático de a horario de verano… la fecha será INVALIDA.

Para resolver lo anterior basta con realizar la misma validación pero con horas, ya que al crear el objeto Date de javascript, este se crea con hora 00:00:00 y como resultado el motor de JS va a tender a restar o sumar una hora, lo que se traduce en que la fecha que se creó en el objeto sea distinta a la que se escribió.

La función correcta sería:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function validafecha(value) {
    var re = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
    // Valida el formato
    if( re.test(value)){
        var adata = value.split('/');//Separa dia, mes y año
        var gg = parseInt(adata[0],10);//pasa el dia a una variable
        var mm = parseInt(adata[1],10);//el mes a una variable
        var aaaa = parseInt(adata[2],10);//el año a una variable
        var fdata = new Date(aaaa,(mm-1),gg,12);//Genera la fecha con los datos ingresados, o cualquier hora distinta a la hora 00
        /**
         * Comienza la validacion:
         * Primero valida que el año del objeto sea igual al entero que se digitó
         * Segundo valida que el numero del mes del objeto, sea igual al entero que se digitó - 1
         * Tercero, valida que el día del objeto sea igual al entero que se digitó
         */

        if( ( fdata.getFullYear() == aaaa ) && ( fdata.getMonth() == (mm-1) ) && (fdata.getDate() == gg) )
            return true;
        else
            return false;
        }else{
            return check;
        }
}

Testeen en el siguiente enlace escribiendo la fecha 11 de Octubre de 2009 en el formato solicitado:
http://www.javascriptkit.com/script/script2/validatedate.shtml
Verán que apesar de que la fecha es valida, les dira lo contrario =).

Back Top

Responses to “Problema: Validar fechas Javascript/Cambio de hora”

  1. No comments yet.
  1. No trackbacks yet.

Leave a Reply

Back Top