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 responses
Cuando tengo que hacer cálculos con fecha en Javascript suelo usar esta librería http://code.google.com/p/datejs/ está un poco “desatendida” pero hace más cómodo trabajar con la clase Date.
@Francisco: Gracias por el dato, ¡está completísima!
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.
¡Excelente aporte! Muy necesario de tener en cuenta para evitar confusiones
Tsss, ¡Genial!
Una librería reciente muy completa y recomendable es moment.js, que puedes descargar desde http://momentjs.com/
slds!
gracias!! estaba buscando esta libreria
[…] cierto, en Javascript también puedes trabajar con objetos de fecha/hora de una forma […]
[…] es una librería completísima para trabajar con fechas en Javascript, que puedes registrar como helper para Ember de modo de facilitar todas la tarea de parsear y […]