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.