Una pregunta bastante repetida en los foros es la manera de restar dos fechas, de manera más o menos rápida. Quizá podría hacerse restando días, meses y años por separado, pero sería muy largo y complejo. Sin embargo, existe el método Date.getTime(), que devuelve el número de milisegundos que han transcurrido desde una fecha (el 1 de enero de 1970, creo recordar) Ese dato no nos sirve demasiado, pero sí pueden compararse y restarse dos valores getTime y así obtenemos la diferencia entre las fechas, en milisegundos. Para convertir los milisegundos en otras unidades hay que tener en cuenta esto, que uno aprende en el colegio: 1 segundo son ----> 1000 milisegundos 1 minuto son ------> 60 segundos 1 hora son ---------> 60 minutos 1 día son -----------> 24 horas
Hay que dividir la diferencia por los números de la columna de la derecha empezando por el primero y hasta la unidad a la que quieran llegar. De modo que si quiero saber cuántas horas faltan para el 1 de Septiembre, escribo esto:
Código :
var sept:Date=new Date (2006,8,1)
//No, no me equivoco, en flash los meses están indexados a 0 por lo que Septiembre es el mes 8
difHoras= Math.floor((sept.getTime()-new Date().getTime())/(1000*60*60))
trace(difHoras);
La diferencia expresada en varias unidades es algo más difícil y para ello he creado esta clase. Lo que hace es pasar primero a las unidades superiores y luego ir hallando el resto y multiplicando por los valores más pequeños (ya sé que es ir y volver pero creo que no puede ser más eficiente). Las variables que se tendrán en cuenta son un Array, con los index del array timeValues.
Código :
class DateSubstract {
private static var factors:Array = [1, 1000, 60, 60, 24];
private static var timeValues:Array = ["miliseconds", "seconds", "minutes", "hours", "days"];
public static function substract(dt1:Date, dt2:Date, values:Array):Object {
//Parámetros Opcionales
if (dt2 == undefined) {
dt2 = new Date();
}
if (values == undefined) {
values = new Array(1, 2, 3);
}
//El último valor del array, para saber cuánto tendremos que dividirlo
var lastValue:Number = values[values.length-1];
//El objeto que devolveremos
var resultado:Object = new Object();
//La diferencia en milisegundos
var dif:Number = dt1.getTime()-dt2.getTime();
var total:Number = dif;
//La pasamos a las unidades superiores
for (var i:Number = 0; i<=lastValue; i++) {
total /= factors[i];
}
var j:Number = values.length-1;
for (i=factors.length-1; i>=0; i--) {
//Si hemos pedido ese dato..
if (values[j] == i) {
//lo redondeamos y devolvemos el resultado redondeado
var redondeado:Number = Math.floor(total);
resultado[timeValues[i]] = redondeado;
//Restamos la cantidad que ya hemos dvuelto a la que queda
total -= redondeado;
j--;
}
//De todas formas multiplicamos el resultado por el factor
total *= factors[i];
}
return resultado;
}
}
Y aquí un ejemplo de uso:
Código :
import DateSubstract;
dt = new Date(2006, 11, 25);
obj = DateSubstract.substract(dt, new Date(), [0, 1, 2, 4]);
trace("Quedan "+obj.days+" días, "+obj.minutes+" minutos, "+obj.seconds+" segundos y "+obj.miliseconds+" milisegundos para Navidad");
Anotado muy util para calcular cumpleaños y demas ... Por:MorphX
Septiembre es el mes 9 en indexación por 1 Septiembre es el mes 8 en indexación por 0 En ningún caso es 7
caravi Por:Carolina_blog
Según yo, esto tiene una explicación:
Código :
var sept:Date=new Date (2006,8,1)
//No, no me equivoco, en flash los meses están indexados a 0 por lo que Septiembre es el mes 7
difHoras= Math.floor((sept.getTime()-new Date().getTime())/(1000*60*60))
trace(difHoras);
Por lógica, sé lo que paso:
zah codeando cerebro, var sept:Date=new Date (2006,8,1) // 8 por que meses en Flash = mes -1 explicando cerebro, El mes de septiembre, volte a ver código, es 8, en eso recuerda que mes en flash = mes-1 entonces dice 7
Por lo tanto el código esta bien, simplemente en el comentario volvio a restar uno al mes.
Salvo que zah diga lo contrario, eso fué lo que paso. Por:Dano
Muy buena Dano, y sí fue justo eso, supongo. Por:Zah
A ver, como parece que no está muy claro cómo funciona voy a explicar dónde poner cada código:
El primer código es sólo un ejemplo para mostrar como se calculan las undades (horas) que faltan para un evento determinado. El segundo script es una clase, que tienes que guardar con el nombre de DateSubstract.as, y el tercer código es un ejemplo de uso de la clase (va en un fla que está en la misma carpeta que la clase) Los dos primeros parámetros de la función DateSubstract.substract son las fechas que vas a restar (new Date(), es la fecha y hora actual) y el tercero es un array con las unidades que quieres mostrar, donde 0 son milisegundos, 1 son segundos y 2, 3 y 4 son minutos, horas y días, respectivamente. Por:Zah
Quisiera saber si además de esto es posible arreglar una lista de eventos, es decir, que al pasar un evento tome la siguiente fecha y calcule lo que resta.
Ej Un equipo de futbol juega partidos los miercoles y los domingos, como hago para planear una temporada completa de X meses sin tener que cambiar la fecha cada que pasa un evento. Por:Gurato_blog
Gurato_blog :
Quisiera saber si además de esto es posible arreglar una lista de eventos, es decir, que al pasar un evento tome la siguiente fecha y calcule lo que resta.
Ej Un equipo de futbol juega partidos los miercoles y los domingos, como hago para planear una temporada completa de X meses sin tener que cambiar la fecha cada que pasa un evento.
Claro ya te lo hacemos ¿A que mail te mando el .FLA? ¿Quieres que le incluya el diseño de la interfaz o que te hagamos un documento tecnico de entrega del proyecto tambien? Por:Freddie
Cuando resto horas con los formatos de celdas en horas, no puedo obtener el tiempo en minutos exactos; por ejm: 02:30 pm - 02:15 pm; quisiera me apareciera 15 min ó en su defecto 0.25 hrs. como hago??? Por:Keila_blog
Hola muy util el codigo, lo quiero utilizar. lo he hecho, comprobado y todo bien, solo logro ver el trace. ahora como hago para que se vea en la pelicula no lo veo cuando publico, o cuando lo vaya a poner en .swf final en donde lo quiero utilizar, estoy confuso y un poco nuevo en actionscript. gracias Por:trumoc_blog
Antes de nada enhorabuena por el tutorial, ZAH.
Muchisimas gracias por la informacion ya que de no ser por ti casi me vuelvo loco por lo de la indexación de los meses.
Intentaba ver la diferencia en horas con el procedimiento getTime y si probais por ejemplo...
var w_dia1:Date = new Date(2009,01,31); // 31 de enero
var w_dia2:Date = new Date(2009,02,01); // 1 de febrero
trace((w_dia2.getTime() - w_dia1.getTime())/3600000);
...deberia mostrar 24 horas de diferencia, sin embargo muestra -48!!
Esto es por lo que ZAH comenta: hay que restar 1 a los meses.
Esto...
var w_dia1:Date = new Date(2009,00,31); // 31 de enero
var w_dia2:Date = new Date(2009,01,01); // 1 de febrero
trace((w_dia2.getTime() - w_dia1.getTime())/3600000);