Comunidad de diseño web y desarrollo en internet online

Manejar fechas en Actionscript como en PHP : Clase Fecha

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!

¿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