Cristalab

Manejar fechas en Actionscript como en PHP : Clase Fecha

Por: _CONEJO + 17.11.2005

Trabajar con fechas en ActionScript puede llegar a ser un verdadero engorro, sobre todo si deseas dar cierto formato al churro de información. En PHP con $var = Date("pattern"); tenemos gran parte del trabajo hecho, simplemente nos devuelve una cadena de texto -o numérica- con el patrón que le indiquemos en el parámetro. (Más información en la página de PHP.net)

La clase Fecha intenta emular esa opción que no existe en ActionScript, una mini-clase que a través de un patrón te devuelve la fecha ordenada como le digas. No tiene mucho misterio, aún le falta algo de trabajo, pero resulta muy cómoda, sobre todo para mostrar fechas sin engorrar el código que tengamos.

Creo que el código es lo suficientemente sencillo como para no tener que comentar mucho.

Código :


/* Clase Fecha
 * Extiende la Clase Date para ofrecer un servicio de formatos como hace en PHP
 * al estilo fecha.formato(d/m/Y - H:i); output "21/06/2005 - 07:30"
 *
 * Se agradecería todo tipo de feedback y reporte de fallos/dudas/problemas
 *
 * @autor : Daniel Esteban García  -  www.theNinjaBunny.com
 */

class Fecha extends Date {
   
   // Algunas variables necesarias
   private var idioma:String;
   private var diasAr,mesesAr:Array;
   private var numDias:Array = new Array("31", "28", "31", "30", "31", "30", "31", "31", "30", "31", "30", "31");

   function Fecha(a:Number,b:Number,c:Number,d:Number,e:Number,f:Number,g:Number) {
      // Creamos el objeto Date
      super(a,b,c,d,e,f,g);
      // Seteamos el idioma, por defecto ESPAÑOL
      setIdioma("ES");
      
   };
   
   
   /* Funcion que nos pone el idioma
    * Util si queremos los meses en otro idioma, añadir nuevos es MUY facil!
    * Haganlo y mandenme algunas traducciones! Para el codigo del idioma usaremos
    * DOS LETRAS
    */
   public function setIdioma(idi:String):Void {
      
      idioma!=null?idioma = idi.toUpperCase():idioma="ES";
      switch (idioma) {
         
         // ESPAÑOL
         case "ES" :
         diasAr = new Array("Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado");
         mesesAr = new Array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");
         break;
         
         
         // INGLES
         case "EN" :
         diasAr = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
         mesesAr = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
         break;
         
         
         // En caso de duda, español!
         default :
         idioma = "ES";
         
      };
   };
   
   // Nos devuelve el idioma actual de la Fecha, no se que tan util sera,
   // pero la funcion era facil de hacer xDxD
   public function getIdioma():String {
      return idioma;
   };
   
   
   /* Esta es la funcion chula, creo que quizas se podría optimizar algo
    * Basicamente lo que hace es parsear letra por letra
    * la $ sirve para escapear letras
    * por ejemplo "d/m/Y $a $l$a$s H:i" imprimiria "01/01/2000 a las 23:07"
    * Algo amorfo, pero con \ se fastidiaba el tema
    */
   public function formato(pattern:String):String {
      
      if(pattern.length>0) {
         var block:Array = pattern.split("$");
         var l:Number = block.length;
         var cadena:String = "";
         
         for(var a:Number = 0;a<l;a++) {
            if(block[a].length>1) {
               if(a!=0) {
                  cadena += block[a].substr(0,1);
               } else {
                  cadena += dameDato(block[0].substr(0,1));
               };
               for(var b:Number = 1;b<block[a].length;b++ ) {
                  cadena += dameDato(block[a].substr(b,1));
               };
            } else if(block[a].length==1) {
               if(a!=0) {
                  cadena += block[a];
               } else {
                  cadena += dameDato(block[0]);
               };
            };            
         };
         return cadena;
      } else {
         return "";
      };
      
   };
   
   
   /* Esta si que es la funcion chula de verdad
    * segun el caracter que le pases como parametro te devolvera el dato
    * que estabas buscando.
    *
    * Usa las mismas letras que en PHP, aunque no estan todas, al final
    * del documento se enuncian las letras que aun no estan implementadas
    *
    * Para saber que hace cada letra dirijanse a :
    * http://es.php.net/manual/es/function.date.php
    */
   private function dameDato(char:String):String {
      var dato:String  ="";
      var tmp:Object = new Object();
      switch(char) {
         case "d":
            tmp = this.getDate();
            tmp.toString().length<2?dato = "0"+tmp.toString():dato = tmp.toString();
         break;

         case "D":
            dato = diasAr[this.getDay()].substr(0,3);
         break;
         
         case "j":
            dato = this.getDate().toString();
         break;

         case "l":
            dato = diasAr[this.getDay()];
         break;

         case "w":
            dato = this.getDay().toString();
         break;

         case "z":
            tmp = this.getMonth();
            var dias:Number = 0;
            if(tmp>0) {
               for(var m:Number = 0;m<tmp;m++) {
                  dias += Number(numDias[m]);
                  if(anioBisiesto(this.getYear()+1900) && m>1) {   dias++; };
               };
            };
            dias += this.getDate();
            dato = dias.toString();
         break;

         case "F":
            dato = mesesAr[this.getMonth()];
         break;

         case "m":
            tmp = this.getMonth()+1;
            tmp.toString().length<2?dato = "0"+tmp.toString():dato = tmp.toString();
         break;

         case "M":
            dato = mesesAr[this.getMonth()].substr(0,3);
         break;
         
         case "n":
            dato = (this.getMonth()+1).toString();
         break;

         case "t":
            if(anioBisiesto(this.getYear()+1900) && this.getMonth()==1) {
               dato = "29";
            } else {
               dato = numDias[this.getMonth()];
            };
         break;

         case "L":
            anioBisiesto(this.getYear()+1900)? dato = "1" : dato = "0";
         break;
         
         case "Y":
            tmp = this.getYear()+1900;
            dato = tmp.toString();
         break;

         case "y":
            tmp = this.getYear()+1900;
            dato = tmp.toString().substr(2,2);
         break;
         
         case "a":
            this.getHours()>=12? dato = "pm" : dato = "am";
         break;

         case "A":
            this.getHours()>=12? dato = "PM" : dato = "AM";
         break;
         
         case "g":
            this.getHours()>=12? dato = (this.getHours()-12).toString() : dato = this.getHours().toString();
         break;
         
         case "G":
            dato = this.getHours().toString();
         break;

         case "h":
            this.getHours()>=12? dato = (this.getHours()-12).toString() : dato = this.getHours().toString();
            dato.length==1 ? dato = "0"+dato : dato = dato;
         break;
         
         case "H":
            dato = this.getHours().toString();
            dato.length==1 ? dato = "0"+dato : dato = dato;
         break;
         
         case "i":
            dato = this.getMinutes().toString();
            dato.length==1 ? dato = "0"+dato : dato = dato;
         break;            

         case "s":
            dato = this.getSeconds().toString();
            dato.length==1 ? dato = "0"+dato : dato = dato;
         break;            

         default :
         dato = char;
         break;
      };
      return dato;
   };
      
   
   // Mini funcion que devuelve si un año es bisiesto o no
   public static function anioBisiesto(ano:Number):Boolean {
      return ((ano%4 == 0) && (ano%100 != 0)) || (ano%400 == 0) ? true : false;      
   };
      
      
};


/* LETRAS SIN IMPLEMENTAR
* e Identificador de zona horaria (agregado en PHP 5.1.0)   Ejemplos: UTC, GMT, Atlantic/Azores
* I (i mayúscula)   Indica si la fecha están en hora de ahorro de luz diurna   1 si es Hora de Ahorro de
* Luz Diurna, 0 de lo contrario.
* O   Diferencia con la hora Greenwich (GMT) en horas   Ejemplo: +0200
* T   Configuración de zona horaria de esta máquina   Ejemplos: EST, MDT ...
* Z   Desplazamiento de la zona horaria en segundos. El desplazamiento para zonas horarias al oeste de UTC es * siempre negativo, y el de aquellas al este de UTC es siempre positivo.   -43200 a 43200
* c   Fecha ISO 8601 (agregada en PHP 5)   2004-02-12T15:19:21+00:00
* r   Fecha en formato RFC 2822   Ejemplo: Thu, 21 Dec 2000 16:01:07 +0200
* U    Segundos desde el Epoch Unix (January 1 1970 00:00:00 GMT)   Vea también time()
* B   Hora Swatch Internet   000 a 999
* o   Número de año ISO-8601. Este es el mismo valor que Y, excepto que si el número de semana ISO (W)
* pertenece al año previo o siguiente, ese año será usado en su lugar. (agregado en PHP 5.1.0)   Ejemplos:
* 1999 o 2003
* S   Sufijo ordinal en inglés del dia del mes, 2 caracteres   st, nd, rd o th. Funciona bien con j
* W   Número de la semana del año ISO-8601, las semanas comienzan en Lunes (agregado en PHP 4.1.0)   Ejemplo:
* 42 (la 42va semana del año)
*/



Ejemplo de uso :

Código :


//Importamos la clase
import Fecha;

//Creamos nuestro objeto Fecha (admite los mismos parametros que Date)
var fecha:Fecha = new Fecha();
// Hacemos que nos muestre la fecha de forma
// "Jueves 17 de Noviembre de 2005"
trace(fecha.formato("l j $d$e F $d$e Y"));


Métodos de la Clase
Fecha.formato("patrón") : Es el que usaremos para obtener las fechas según nuestro patrón
Fecha.setIdioma("código") y Fecha.getIdioma() : Set y Get para manejar los diferentes idiomas
Fecha.anioBisiesto(año) : Esta función es estática, por lo que la podrás usar a placer, te dirá si un año es bisiesto o no.

Otras cosas
- Se agradecerá el reporte de todo tipo de fallos, así como las mejoras que se puedan hacer.
- También si alguien sabe idiomas, que nos diga los días de la semana y meses de cuántos sepa.

Eso es todo, disfrútenla!

Etiquetas actionscript

Comentarios | Enviar un comentario
Excelente, en verdad me viene útil. Gracias
Por: Norke
Impresionante ICEM4AN, en breve seguiré tu ejemplo Muy Feliz

Por cierto F. desde Linux, no veo mientras escribo, has pasado esto también a Flash8?? Aw Crap[/offtopic]
Por: MorphX

Código :

import Fecha; 


esta linea no es necesaria ICEM4N

Dejame revisarla y te avisaré si encuentro algun fallo o le puedo hacer alguna mejora Lengua

saludos Sonrisa
Por: Maikel
Muy buena ICEM4N.. es verdad al menos a mí me daba mucha flojera trabajar con el Objeto Date de Flash...
Maikel !! por que no es necesario el import!!
Por: t2k_blog
Muy buena ICE! Sonrisa
Por: Prozac
No es que el import no sea necesario; pero es preferible por buenas practicas de programación ponerlo.

Por otro lado, cuando todos estemos en Actionscript 3; solamente funcionara si haces el import.
Por: Freddie
Claro esa es la forma correcta de trabajar.
Dime Freddie A.S. 3 será exigente con los ' ; ' ???
Por: t2k_blog
AS3 sera exigente con todo, t2k, como C++

Para mas info, mira:
http://www.cristalab.com/blog/12386/actionscript_3_+_flash_player_8.5_+_flex_2_+_flash_8.5
Por: Freddie
Pues ya era hora habian compañeros programdores que no lo tomaban en serio debido a que no tenia un control estricto de sintaxis.. Que le podemos hacer eran simples prejuiciosos.
Juzgaban sin conocerlo [BOFH: Cuida tu lenguaje]
Por: t2k_blog
Excelente idea, theNinjaBunny miau

___________________________________

Algunas sugerencias.


1.- No lo necesitas:

Código :

private var numDias:Array = new Array("31", "28", "31", "30", "31", "30", "31", "31", "30", "31", "30", "31"); 

____________________




2.- Evitamos pasarle undefined, a la constructora de DATE

Código :

Fecha() {
      // Creamos el objeto Date
      super(arguments);
      // Seteamos el idioma, por defecto ESPAÑOL
      setIdioma("ES");
     
   };

__________________


3.- S/C

Código :

idioma= (!idioma) ? "ES" : idi.toUpperCase(); 

__________________


4.- Esto(el código de abajo) no te servirá, ya que si le pasas "ru", unicamente setea el valor de idioma a "ES", pero diasAr y mesesAr, queda sin definir(undefined)

Código :

    // En caso de duda, español!
         default :
         idioma = "ES";
         
      };

________________


5.- La función formato. Yo lo que haría, sería simplemente recorrer la cadena, y parsearla caracter por caracter, y ya.



Es por ahora lo que veo. Guiño

Saludos, y felicidades! Guiño
Por: Dano

Dano :

1.- No lo necesitas:

Código :

private var numDias:Array = new Array("31", "28", "31", "30", "31", "30", "31", "31", "30", "31", "30", "31"); 


Oh, creo que si. En PHP hay una función que te devuelve el día del año en el que estas(o más bien está la fecha) en AS no encontré una similar, por lo que lo que hago es según el mes calculo los días de los meses anteriores y le sumo los de este.


Dano :


2.- Evitamos pasarle undefined, a la constructora de DATE

Código :

Fecha() {
      // Creamos el objeto Date
      super(arguments);
      // Seteamos el idioma, por defecto ESPAÑOL
      setIdioma("ES");
     
   };


Pues probaré a ver si funciona asi, por que es "arguments" y no "args" por ejemplo?

Dano :


Código :

idioma= (!idioma) ? "ES" : idi.toUpperCase(); 


4.- Esto(el código de abajo) no te servirá, ya que si le pasas "ru", unicamente setea el valor de idioma a "ES", pero diasAr y mesesAr, queda sin definir(undefined)

Código :

    // En caso de duda, español!
         default :
         idioma = "ES";
         
      };



Definitivamente si, esa parte no me quedó muy estética, además de que por defecto seteaba el idioma a "ES"

Dano :


5.- La función formato. Yo lo que haría, sería simplemente recorrer la cadena, y parsearla caracter por caracter, y ya.

Si, cierto, todo fué por un planteamiento anterior


GRACIAS! apuntaré todas las mejoras y las subiré a
http://www.theninjabunny.com/proyectos
Por: _CONEJO
Ya se hicieron las mejoras pertinentes y se añadió el francés y el alemán
Por: _CONEJO
1.- No lo necesitas:

Ehm bueno como lo tienes, también te sirve, y bien. Lo que pasa es que yo me refería a que crearas un método:

Código :

Fecha.getDaysOfMont();

Y este los calculará dinámicamente. Pero con tu array, y el control de si es año bisiesto, es suficiente. Guiño



Pues probaré a ver si funciona asi, por que es "arguments" y no "args" por ejemplo?


Hay que preguntarle a los de macromedia, por que se decidierón por arguments, y no por args. Yo desconozco la razón. Guiño
Por: Dano
la pagina es buena y tambien el tema
Por: tranck_blog
muy buena
Por: fernan_blog
Hola exelente la class fecha, mis felicitaciones, les comento estoy tratando de armar algo que compare la fecha actual y saque los dias restantes a una fecha ya marcada, les doy un ejemplo:
////////////////////////////////////
//comparar fecha
import Fecha;
var fecha:Fecha = new Fecha();
//esta es la fecha hoy
hoy=fecha.formato("l j $d$e F $d$e Y");
//fecha destino evento
evento='Sabado 06 de Enero de 2007';
// dias restante
dias_restantes='?';
////////////////////////////////////
no se si se entiende tomar la fecha hoy y restarla a la fecha evento y sacar los dias que restan
agradeceria aportes u opiniones.
gracias
Castro David
Desarrollo web
Por: David Castro_blog
Porque la clase getDato ("dameDato") es private??

Saludos
Por: GereMora_blog
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.