Joda Time: rediseñando las librerías de fechas en Java
15 julio 2008 at 12:05 pm 6 comentarios
Aunque había oído hablar hace tiempo de Joda Time, acabo de profundizar algo más en esta librería para el manejo de fechas en Java gracias a este buen artículo de OCI ( en inglés).
La utilización de fechas en Java siempre ha tenido algunos problemas asociados, desde la molesta aunque salvable asignación de los meses desde cero (el mes 1 es febrero) hasta la complejidad para realizar algunos cálculos relativamente simples como el cálculo de días entre dos fechas.
Para solucionar estos problemas nació Joda Time y además ahora ha sido el punto de partida del JSR 310 (Java Specification Request) por lo que algún día lo podríamos encontrar como el estándar en el lenguaje.
Joda Time define los llamados instantes, que representan un día y hora determinados en un lugar y calendario determinados. Es decir, una definición sin posibilidad de confusión. La clase más utilizada para definir un instante es DateTime
.
Un segundo concepto que define Joda Time son los parciales, compuestos por partes de un instante, y que por tanto no definen univocamente una fecha. Por ejemplo LocalDateTime
no incluye información referente a la zona horaria o el calendario.
Otro cocepto importante en Joda Time son los intervalos, definidos por dos instantes.
Finalmente, los últimos conceptos que vamos a ver son la duración y los periodos. Duración representa una cantidad de milisegundos, mientras que un periodo puede estar definido en días, meses u otras unidades (o un conjunto de ellas).
Bueno, y como al final siempre es mejor una imagen (o un trozo de código) que mil palabras, pues vamos a mostrar algunos ejemplos.
public void daysBetween() { //Instante actual en la cronología por defecto //y en la zona horaria del sistema DateTime today = new DateTime(); //Instante a medianoche del 1 de enero de 2008 DateMidnight jan01 = new DateMidnight(2008, 1, 1); System.out.println("Días desde el 1 de enero: " + Days.daysBetween(jan01, today).getDays()); }
Como vemos, es bastante sencillo calcular los días entre dos instantes determinados.
Vamos a ver con otro ejemplo lo sencillo que resulta calcular nuevas fechas, olvidándonos de cálculos de días por mes u otras complicaciones.
public void incrementDates() { //Instante a medianoche del 11 de junio de 2008 DateMidnight jun11 = new DateMidnight(2008, 6, 11); //Le añadimos 5 días DateMidnight plus5Days = jun11.plusDays(5); //Le añadimos un mes DateMidnight plusMonth = jun11.plusMonths(1); //Le añadimos 6 meses DateMidnight plus6Month = jun11.plusMonths(6); System.out.println("Fecha inicial: " + jun11.toString()); System.out.println("Fecha más 5 días: " + plus5Days.toString()); System.out.println("Fecha más 1 mes: " + plusMonth.toString()); System.out.println("Fecha más 1 mes: " + plus6Month.toString()); }
Esto produce la siguiente salida:
Fecha inicial: 2008-06-11T00:00:00.000+02:00
Fecha más 5 días: 2008-06-16T00:00:00.000+02:00
Fecha más 1 mes: 2008-07-11T00:00:00.000+02:00
Fecha más 1 mes: 2008-12-11T00:00:00.000+01:00
Fijaos en el +2 debido a que mi zona horaria es GMT+1 y estamos en horario de verano (daylight savings), pero que en noviembre ya estamos fuera del horario de verano.
Por último, vamos a ver alguna facilidad más que nos da Joda Time:
public void checkFeatures() { DateTime today = new DateTime(); DateTime.Property month = today.monthOfYear(); System.out.println("Mes: " + month.getAsShortText()); System.out.println("Mes: " + month.getAsText()); System.out.println("Mes: " + month.getAsText(Locale.ENGLISH)); DateTime.Property week = today.weekOfWeekyear(); System.out.println("Semana: " + week.getAsText()); }
Que provoca la siguiente salida:
Mes: jul
Mes: julio
Mes: July
Semana: 29
Y hasta aquí llega mi pequeña revisión de esta librería que nos puede facilitar bastante el trabajo con fechas en Java.
6 comentarios Add your own
Deja una respuesta
Trackback this post | Subscribe to the comments via RSS Feed
1.
Peto | 17 julio 2008 a las 1:22 am
Justo hoy he utilizado DateTime en c#, en concreto por el daylightsaving… parece clavado al JodaTime, aunque la verdad es que en c# hay muchas cosas que recuerdan a Java.
Enhorabuena por el blog, sigue así, a mí me está encantando, aunque me falta tiempo para instalarme y probar el cakePHP…bueno y lo demás, por eso no había comentado nada todavía, pero ya sacaré un rato y seguro que me surgen dudillas, aunque tal como lo pintas debe estar tirado… ya veremos.
Un abrazo!
Peto
PD: Ahhh y estupendo lo del MVC, hoy he oido que Micro$oft está trabajando en un framework orientado a MVC… seguro que será… ¿barato?! ;-P
2.
conocer un dia de la semana | 19 febrero 2009 a las 3:51 pm
Sabes como hacer para referirse en Joda – Time a el dia martes (cualquier los martes) o lunes, etc. Porque en mi caso necesito que el usuario elija un dia sin saber la fecha exacta….
3.
Miguel | 19 febrero 2009 a las 8:41 pm
No entiendo muy bien lo que quieres decir.
¿Podrías explicar un poco más lo que quieres hacer?. Te intentaré ayudar.
Gracias por leer mi blog.
4.
Como uso el JODA-TIMe | 23 agosto 2009 a las 3:01 am
como puedo usar esta libreria en java????, como hacer para importarlas desde java. O mejor aun hacer que java me entienda tal libreria. EStoy usando NETBEANS. Gracias
5.
Miguel | 23 agosto 2009 a las 9:53 am
Sólo tienes que descargarte el último archivo (son zip) desde la sección de descargas de la web de Joda Time.
En dicho zip hay tres jars y con incluir joda-time-1.6.jar en las librerías de tu proyecto ya lo puedes usar.
6.
David | 26 mayo 2010 a las 9:43 pm
Exelente contribución gracias.