Comunidad de diseño web y desarrollo en internet

Restar dos fechas en Flash con Actionscript

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");

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate