lunes, abril 30, 2007

Nos adueñamos del tiempo - Fechas en Java

¿Cansado de renegar con los objetos Date y GregorianCalendar?
¿Le han pedido que calcule la cantidad de días entre dos fechas?
¿Está a punto de apretar el gatillo? NO LO HAGA!!!!
Este post fue motivado por un foro de La Web del Programador, que tanto me ha ayudado y en donde intento colaborar también. ¿Se han fijado que muy pocas veces encontramos tutoriales o proyectos de ejemplo donde pongan fechas?. Debo confesar que en varios cursos iniciales las trato de evitar hasta que veo que los alumnos han avanzado en sus conocimientos. Quiero presentarles un API llamada JODA (no sé exactamente que significan las siglas), pero en especial las Joda-Time.

Por ejemplo, para calcular la cantidad de días entre dos fechas con el API de Java (java.util) debería hacer lo siguiente:

//Creo las dos instancias de fecha
GregorianCalendar gc = new GregorianCalendar(2000, 11, 20);
GregorianCalendar gc1 = new GregorianCalendar(2000, 11, 25);
//Obtengo los objetos Date para cada una de ellas
Date fec1 = gc.getTime();
Date fec2 = gc1.getTime();
//Realizo la operación
long time = fec2.getTime() - fec1.getTime();
//Muestro el resultado en días
System.out.println(time/(3600*24*1000));

Ahora, un par de consideraciones:
  • El método getTime() retorna un long que simboliza la cantidad de milisegundos transcurridos desde el 01/01/1970.
  • El resultado de restar los dos long da como resultado (nuevamente) cantidad de milisegundos.
  • La fórmula time/(3600*24*1000) sirve para pasar los milisegundos a días.
Ahora veamos cómo se hace con el API de Joda:

//Creo las dos instancias de fecha

DateMidnight jodafec1 = new DateMidnight(2000, 11, 20);
DateMidnight jodafec2 = new DateMidnight(2000, 11, 25);

//Realizo la operación
Period periodo = new Period(jodafec2.getMillis()-jodafec1.getMillis());
//Muestro el resultado en días
System.out.println(periodo.getDays());

Sin duda esta nueva forma reduce la complejidad de los cálculos, sólo veo una cosa en contra de esta API: utiliza demasiado los parámetros tipo Object, lo que nos daría un poco de riesgo al momento de comprobación de tipos, pero los mismos creadores lo admiten, en pos de la facilidad de extensión que tiene esta librería.

Saludos

15 Comments:

At 9:12 a. m., Blogger Toni said...

el ultimo fragmento de codigo no funciona correctamente.

 
At 3:08 p. m., Blogger Pablo Frias said...

Toni, lo acabo de revisar y funciona. En el siguiente link puedes bajar el fuente. Si sigue saliendo error, por favor envíame el texto del error a mi correo: mundojava.blogspot.com@gmail.com

 
At 12:00 p. m., Anonymous Zidboy said...

Hola Pablo:

Primero que todo darte las gracias por el gran aporte que haces ya que con la busqueda en cuanto al tema de las fecha, es solo con tu post que logre terminar un tips que tengo en mi aplicacion.

Habia oido sobre esa API pero no la he usado aun, osea lei tu post acerca del API Joda pero no la estoy usando, solo te robre unos pedasos de codigo pero de las API antiguas.

Espero sigas creando post al respecto, de echo yo estoy muy interesado desde hace mucho, pero mi falta de tiempo a impedido que cree un post.

Saludos y Gracias.

 
At 6:49 a. m., Anonymous José Antonio Quiles said...

Hola Pablo,
¿estás considerando que entre las dos fechas puede haber un cambio de hora?
Por ejemplo, entre el 25 de marzo de 2009 y el 31 de marzo de 2009...

 
At 11:58 a. m., Blogger santos en remera said...

Gracias capo! :D

 
At 12:35 a. m., Anonymous Anónimo said...

me salvaste gracias

 
At 2:40 a. m., Anonymous Anónimo said...

Coño, me ha funcionado genial...
Saludos para el compa

 
At 2:00 p. m., Blogger Daniel said...

una pregunta amigos, Esto cuenta correctamente los años bisiestos y ese tipo de cosas?

 
At 4:35 p. m., Blogger Gary said...

Hola, pues la verdad no use eso que dices, xD pero como dijeron antes me robe unas lineas de codigo C_C muchas gracias por publicar esta ayuda :D
seeeeeeeee se te agradece mucho c_C

 
At 12:43 p. m., Anonymous denniskano said...

saludos, bueno interesante, pero la consulta es tengo dos fechas, quiero la diferencia de dias, estuve trabajando con milisegundos comvirtiendo, y el resultado no es el que quiero, resulta que cuando pasa un dia de otro me arroja cero, puesto que no paso 24 horas, alguien puede darme solucion?

 
At 7:37 a. m., Anonymous Anónimo said...

Buenas, con esos cálculos si quiero los días entre el 28/2/2010 y el 1/3/2010 me da 3 días... ¿Está teniendo en cuenta todos los meses como si tuviesen 30 dias?

 
At 3:29 p. m., Anonymous hwongu said...

Para ver la diferencia de dias entre dos fechas pueden visitar mi blog, un aporte para ustedes que les puede ser util tambien

http://hwongu.blogspot.com/2010/09/metodo-utilizado-para-obtener-el-numero.html

 
At 7:03 p. m., Blogger Mack said...

Realmente muy bueno tu ejemplo

Graciassssssssss

 
At 1:38 p. m., Anonymous Anónimo said...

Yo se que es un poco tarde para el comentario... pero han probado la libreria http://www.date4j.net/??? Para mi es mucho mejor y menos engorrosa que JODA y todas las demás...

 
At 1:22 a. m., Anonymous Anónimo said...

caramba.... me ha sido de gran utilidad gracias....

 

Publicar un comentario

<< Home