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.
Por cierto F. desde Linux, no veo mientras escribo, has pasado esto también a Flash8??
Código :
esta linea no es necesaria ICEM4N
Dejame revisarla y te avisaré si encuentro algun fallo o le puedo hacer alguna mejora
saludos
Por t2k el 18 de Noviembre de 2005
Maikel !! por que no es necesario el import!!
Por otro lado, cuando todos estemos en Actionscript 3; solamente funcionara si haces el import.
Por t2k el 18 de Noviembre de 2005
Dime Freddie A.S. 3 será exigente con los ' ; ' ???
Para mas info, mira:
http://www.cristalab.com/blog/12386/actionscript_3_+_flash_player_8.5_+_flex_2_+_flash_8.5
Por t2k el 18 de Noviembre de 2005
Juzgaban sin conocerlo [BOFH: Cuida tu lenguaje]
___________________________________
Algunas sugerencias.
1.- No lo necesitas:
Código :
____________________
2.- Evitamos pasarle undefined, a la constructora de DATE
Código :
__________________
3.- S/C
Código :
__________________
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 :
________________
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.
Saludos, y felicidades!
Dano :
Código :
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 :
Pues probaré a ver si funciona asi, por que es "arguments" y no "args" por ejemplo?
Dano :
Código :
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 :
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
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 :
Y este los calculará dinámicamente. Pero con tu array, y el control de si es año bisiesto, es suficiente.
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.
Por tranck el 23 de Noviembre de 2005
Por fernan el 23 de Noviembre de 2005
Por David Castro el 18 de Mayo de 2006
////////////////////////////////////
//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 GereMora el 02 de Junio de 2006
Saludos