Trabajar con fechas en Javascript

En AyerViernes estamos trabajando en un proyecto tan ambicioso como apasionante, lo que como siempre implica aprender nuevas técnicas, habilidades, etc; y en este caso un desafío interesante tenía que ver con trabajar de forma precisa con fechas a nivel de cliente.

El problema surge cuando pensamos en una fecha como una cadena de texto (por ejemplo 2010/06/12 asumiendo que estamos usando un formato año/mes/día como recomendaría la W3C) y necesitamos realizar algún cálculo con esa fecha, como sumar o calcular diferencia de días, ya que como sabemos, los meses pueden tener 30 o 31 días, Febrero tiene 28 (o 29 si es año bisiesto), etc… por lo que a 2010/06/12 no es tan fácil sumarle 60 días sin antes comprobar todas esas variables.

Sin embargo, el error fundamental ahí es nuestra primera suposición (tratar a una fecha como una cadena de texto o un conjunto de números), ya que estas dificultades se resuelven al trabajar con las fechas como objetos Date de Javascript.

Podemos crear un objeto de fecha con var fecha = new Date(). Sin parámetros, fecha será igual al momento en que se crea el objeto (o sea, el día presente y el tiempo actual); también es posible crear objetos que representen fechas específicas especificando ciertos parámetros:

  • como tiempo UNIX en milisegundos, como en var fecha = new Date(1234567890000);
  • un string completo que represente el tiempo, por ejemplo: var fecha = new Date("December 17, 1995 03:24:00");
  • indicando el año, mes, día (y de forma opcional, horas, minutos, segundos y milisegundos), por ejemplo: var fecha = new Date(2010, 06, 12);. Ojo, que Enero se cuenta como mes 0, y de ahí en adelante (o sea, 06 corresponde a Julio)

El valor de un objeto de fecha siempre está representado en tiempo UNIX como milisegundos, es decir, como un número sencillo, lo que facilita bastante la posibilidad de calcular diferencias de fechas:

var fechaInicial = new Date(2010, 1, 22), // 22 de Marzo del 2010 -  los meses comienzan a contar desde 0
	valorFecha = fecha.valueOf(),  // 1269226800000
	valorFechaTermino = valorFecha +  ( 60 * 24 * 60 * 60 * 1000 ), // 60 días después, como milisegundos ( días * horas * minutos * segundos * milisegundos )
	fechaTermino = new Date(valorFechaTermino) // nuevo objeto de fecha: 20 de mayo - Thu May 20 2010 23:00:00 GMT-0400 (CLT)

Y podemos olvidarnos de cuántos días tiene un mes y todos esos detalles, ya que javascript los resolverá por ti.

Para complementar, adjunto una pequeña clase para facilitar algunas operaciones básicas para trabajar con fechas, como convertir de texto (o un array, en realidad) a fecha, de fecha a texto, sumar días, y reformatear una fecha: dateHelper.js

También puedes consultar más información sobre fechas en la documentación de Javascript de Mozilla.

9 thoughts on “Trabajar con fechas en Javascript

  1. Tip: Hay que tener en cuenta que las horas minutos y segundos tambien cuentan a la hora de comparar dos fechas en javascript, pongamos un ejemplo, supongamos que la fecha actual es 2013/02/03 (03 de Febrero del 2013) y queremos comparar esta fecha para saber si es mayor que una fecha dada por el usuario:

    var fecha_actual = new Date();//Sun Feb 03 2013 00:12:42 GMT-0600 (CST)
    var fecha_actual_time = fecha_actual.getTime(); //1359871982414
    var fecha_usuario = new Date(2013,2,3); // Sun Feb 03 2013 00:00:00 GMT-0600 (CST)
    var fecha_usuario_time = fecha_usuario.getTime(); //1359871200000
    if(fecha_actual_time > fecha_usuario_time){
    alert(‘Es mayor’);
    }else{
    alert(‘Es menor’);
    }

    Si se dan cuenta el time de las dos fechas es distinto, y esto es por que la fecha actual se crea con horas,minutos y segundos configuradas por el cliente, y la segunda se fecha se crea sin estos parametros y son definidos como 0,0,0, esto puede llevarnos a resultados inesperados e inconvenientes con nuestras aplicaciones, para solucionar estos problemas es recomendable (siempre que se pueda) crear los objetos date sin los parametros de tiempo.

    var today_tmp = new Date();// Objeto temporal de la fecha actual
    var today = new Date(today_tmp.getFullYear(), today_tmp.getMonth(), today_tmp.getDate());

    Saludos y espero haber ayudado en algo.

Comments are closed.

%d bloggers like this: