¿Quieres registrarte?

Restar dos fechas en Flash con Actionscript

Por: Zah
19 de Agosto del 2006
3769 de clabLevel
Otros artículos de Zah
20,290 visitas

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

Enviar a twitter Enviar a facebook


También te interesa


Etiquetas actionscript

Comentarios | Enviar un comentario
Anotado :)
muy util para calcular cumpleaños y demas ... :P
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. :lol:
Por: Dano
XD XD XD
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);

... si es correcto.

Gracias, Zah.
Por: Juan Antonio-blog
Gracias Zah
Por: chris-blog
Muy bueno el metodo, sin embargo el codigo del fla me daba multiples errores por falta de tipificacion de variables asi como instanciacion de la clase DateSubstract.

Lo arregle de esta manera por si a alguien le pasa lo mismo que a mi:

import DateSubstract;
var dt:Date = new Date(2006, 11, 25);
var ds:DateSubstract = new DateSubstract();
var obj = ds.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");
Por: Manolito_BCN
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.