Presentación de JODA-TIMEEn este artÃculo voy a presentar a JODA-TIME, una librerÃa creada para mejorar las limitaciones que poseen las clases proporcionadas por el JDK (Date & Calendar). JODA-TIME es un proyecto open source comenzado por Stephen Colebourne, el cual puede utilizarse bajo el licenciamiento de Apache 2.0. ¿Cómo encontré JODA-TIME?Hace muchÃsimos, muchÃsimos años atrás… Me tope con el desafÃo de desarrollar un sistema en el que el factor tiempo era muy importante. Fue uno de mis primeros desarrollos como profesional independiente, después de haber trabajado en algunas empresas de la provincia. |
De mis trabajos anteriores habÃa incorporado casi por osmosis el hecho de que las clases Date y Calendar no eran lo mas cómodo y limpio para trabajar. Por lo general la solución en estos casos era una librerÃa de utilidades que incluÃa funcionalidades para manipular datos de fechas. Lamentablemente, asà como incorporé el problema también incorporé la solución.
De este modo comenzó el desarrollo de las clases de utilerÃas, DateData, DateUnit, DateIterator y clases por el estilo. El tiempo y la llegada de nuevos desafÃos hicieron que la posibilidad de agregados y refactors en estas clases fuesen casi un hecho.
Entonces la pregunta cayó de madura. ¿ValÃa la pena invertir tiempo en mantener estas clases de utilerÃas? Después de un pequeño análisis y algunas pruebas, la respuesta también cayó de madura. ¡Encontré JODA-TIME!
¿Cuáles fueron mis razones?
Después de la pequeña historia narrada en el apartado anterior, ustedes mis audaces lectores, podrán ir imaginando, que fue lo que me brindó JODA-TIME.
Estas son las razones principales por las que yo elegà utilizar JODA-TIME.
Estas son las razones principales por las que yo elegà utilizar JODA-TIME.
- Facilidad: En contraste con las clases que propone el JDK (Date & Calendar) para el manejo de fechas, JODA-TIME propone métodos de acceso sencillo a la información de la fecha.
- Funcionalidades: JODA-TIME proporciona un conjunto completo de funcionalidades necesarias para realizar cálculos de fecha y hora.
- Interoperabilidad: La biblioteca utiliza una instantánea en milisegundos idéntica a la que utiliza JDK, esto hace que sea simple la interoperabilidad. Podemos pasar con facilidad de las clases del JDK a las clases del JODA-TIME y viceversa. Esto nos permite por ejemplo persistir nuestros datos como Date y procesarlos como JODA-TIME.
- Madurez: Es un API que esta en desarrollo desde el 2002 y se encuentra muy testeada. Además me brindó la tranquilidad de que fuese utilizada por productos como iReport para el manejo de fecha.
- Documentación: En el sitio oficial, se encuentra mucha documentación sobre como utilizar esta librerÃa.
- Open Source: Licencia Apache versión 2.0.
Mis Razones en Código Fuente
Facilidad
JDK       //Incializo un Date con la fecha de hoy       Date dateJDK = new Date();
       //Debo recuperar los valores a través de un Calendar       GregorianCalendar gc = new GregorianCalendar();              //Vinculo el Calendar con el Date       gc.setTime(dateJDK);              //Imprimo el año       System.out.println("Año: " + gc.get(Calendar.YEAR));              //Imprimo el mes. Sumo uno por que enero es 0.       System.out.println("Mes: " +( gc.get(Calendar.MONTH) + 1));              //Imprimo el dia.       System.out.println("DÃa: " + gc.get(Calendar.DAY_OF_MONTH));
JODA-TIME
       //Incializo un DateTime con la fecha de hoy       DateTime dateJODA = new DateTime();
       //Imprimo el año       System.out.println("Año: " + dateJODA.getYear());               //Imprimo el mes       System.out.println("Mes: " + dateJODA.getMonthOfYear());              //Imprimo el dÃa       System.out.println("DÃa: " + dateJODA.getDayOfMonth());
Funcionalidades
Ejemplo UNO
JDK       //Incializo un Date con la fecha de hoy       Date dateJDK = new Date();
       //Debo recuperar los valores a través de un Calendar       GregorianCalendar gc = new GregorianCalendar();              //Vinculo el Calendar con el Date       gc.setTime(dateJDK);              //Sumo dos año       int anio = gc.get(Calendar.YEAR);       gc.set(Calendar.YEAR, anio + 2);
       //Sumo un mes       int mes = gc.get(Calendar.MONTH);       gc.set(Calendar.MONTH, mes + 1);
       //Sumo un dia       int dia = gc.get(Calendar.DAY_OF_MONTH);       gc.set(Calendar.DAY_OF_MONTH, dia + 1);
       //Imprimo el año       System.out.println("Año: " + gc.get(Calendar.YEAR));              //Imprimo el mes. Sumo uno por que enero es 0.       System.out.println("Mes: " + (gc.get(Calendar.MONTH) + 1));
       //Imprimo el dia.       System.out.println("DÃa: " + gc.get(Calendar.DAY_OF_MONTH));
JODA-TIME
       //Incializo un DateTime con la fecha de hoy       DateTime dateJODA = new DateTime();
       dateJODA = dateJODA.plusYears(2)               .plusMonths(1)               .plusDays(1);              //Imprimo el año       System.out.println("Año: " + dateJODA.getYear());
       //Imprimo el mes       System.out.println("Mes: " + dateJODA.getMonthOfYear());
       //Imprimo el dÃa       System.out.println("DÃa: " + dateJODA.getDayOfMonth());
Ejemplo DOS
JDKÂ Â Â Â Â Â Â Date date = new Date();Â Â Â Â Â Â Â SimpleDateFormat format = new SimpleDateFormat("MMM", new Locale("es"));Â Â Â Â Â Â Â System.out.println("Mes: " + format.format(date));
       format = new SimpleDateFormat("MMM", Locale.US);       System.out.println("Mes: " + format.format(date));
       format = new SimpleDateFormat("MMM", Locale.FRENCH);       System.out.println("Mes: " + format.format(date));
JODA-TIME
       DateTime dateJODA = new DateTime();
       System.out.println("Mes: " + dateJODA.monthOfYear().getAsText(new Locale("es")));       System.out.println("Mes: " + dateJODA.monthOfYear().getAsText(Locale.US));       System.out.println("Mes: " + dateJODA.monthOfYear().getAsText(Locale.FRENCH));
Interoperabilidad
JODA-TIME > JDK
       DateTime dateJODA = new DateTime();       Date date = dateJODA.toDate();       Calendar calendar = dateJODA.toCalendar(new Locale("es", "AR"));
JDK > JODA-TIME
Otras Razones
Si buscamos en el sitio de JODA-TIME podremos encontrar otras razones por las cual el autor cree que es bueno elegir esta librerÃa. A continuación, dichas razones…
Espero que disfruten de esta publicación y dejo para futuras publicaciones, ejemplos con usos mas avanzados de esta API.
- Extensible: JDK es compatible con otros sistemas de calendarios definiendo subclases de Calendar. El problema esta en que es un tanto complejo implementar una subclase de calendar. JODA-TIME tiene solucionado este problema a través de la clase Cronology.
- Time Zone: La implementación de las zonas horarias esta basada en la base de datos publica de zonas horarias, la cual es actualizada varias veces al año. Los nuevos release de esta librerÃa incluyen los cambios en dicha base de datos. De todas formas fácilmente se pueden agregar a mano.
- Rendimiento: JODA-TIME tiene mejor rendimiento que las clases de JDK.
- Soporte de Calendario: JODA-TIME soporta 8 sistemas de calendarios.
Conclusiones
JODA-TIME es una librerÃa open source que ofrece una solución sencilla a las limitaciones de las clases Date y Calendar. Implementa la funcionalidad necesaria para operar con datos de fecha y como vimos en esta pequeña presentación muy simple de implementar en nuestros proyectos.ÂEspero que disfruten de esta publicación y dejo para futuras publicaciones, ejemplos con usos mas avanzados de esta API.
Â
Fuentes
- Proyecto: http://joda-time.sourceforge.net/
- User Guide: http://joda-time.sourceforge.net/userguide.html
- FAQ: http://joda-time.sourceforge.net/faq.html
- Javadoc: http://joda-time.sourceforge.net/api-release/index.html
- Download: http://sourceforge.net/project/showfiles.php?group_id=97367&package_id=104212
Actualizado (Domingo, 14 de Marzo de 2010 15:01)


Comentarios
Las clases del JDK estan mal diseñadas, ademas de ser limitadas. Fijate el manejo de periodos de tiempos en JODA-TIME, y lo que tendrias que ensuciar tu codigo para ir haciendo cosas como la que podes hacer con JODA-TIME.
Hicimos una aplicacion de astronomia que calculaba la posicion de los planetas a una fecha determinada con Calendar y Date. Imaginate si no aprendimos y usamos estas clases. Hay muchas cosas que no estan buenas de Date y Calendar.
De todas maneras SUN siempre ha hecho una mejora continua en el API.
Estan desarrollando ahora la especificacion JSR 310 cuyo objetivo es desarrollr una API que sustituya las clases Date y Calendar de la especificación Java SE.
Además esta especificación se esta desarrollando tomando en cuenta precisamente JodaTime entre otras.
Por que justamente no estaban bien diseñadas. En cuanto las exigis te das cuenta de las falencias.
la verdad no sabia nada de esta nueva libreria. A veces pienso que el tema de la clase Date del JDK tiene muchos problemas porque no se la usa correctamente, pero si les pasa a la mayoria, significa que no lo han diseñado muy "amigable"...
vamos a ver que sale con esto
Usted es el SR. Aleph que yo conozco? El guru temido de buenos aires y bariloche??????? Mi amigo aleph?
Claro, justamente es lo que quize resaltar en cuanto a la madurez de JODA-TIME, es un API que funciona muy bien y se usa en una gran cantida de aplicaciones open source tambien.
No la conocÃa, asà que la voy a tener muuyyyy en cuenta
Tenés razón.
De todas maneras prometo mejores y mas potentes ejemplos en la proxima publicación de JODA-TIME!
aunque parece joda y poco serio, el joda time se usa mucho.
En mi laburo anterior hacÃamos aplicaciones comerciales para las bolsas electrónicas de muchos paises y usabamos joda time en todas las aplicaciones.
Es muy estable y nunca tuvimos un bug relacionado con joda time
Y ahora te paso algunas crÃticas
- Te faltó mencionar que está la propuesta de una API similar de manejo de tiempo para incluir en java 7.
http://today.java.net/pub/a/today/2008/09/18/jsr-310-new-java-date-time-api.html
aunque por lo que leÃ, todavÃa no está implementado y vaya a saber cuando lo harán.
- El ejemplo UNO en JDK lo podés simplificar usando el método "add" de Calendar.
QuedarÃa:
//Sumo dos año
gc.add(Calendar.YEAR, 2);
//Sumo un mes
gc.add(Calendar.MONTH, 1);
//Sumo un dia
gc.add(Calendar.DAY_OF_MONTH, 1);
y obtenés el mismo resultado
Suscripción de noticias RSS para comentarios de esta entrada.