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:
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.
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:
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¨);