miércoles, 12 de diciembre de 2007

Manejo de Fechas en Java

Éste es un tema que puede parecer básico, pero usualmente veo ejemplos en la web que utilizan estrategias totalmente "retorcidas" para formatear fechas o hacer operaciones con las mismas.

Desde hace un tiempo uso un framework que facilita el manejo de fechas en Java y se puede integrar muy bien con Hibernate. Le podemos decir adiós a las "transformaciones" entre java.util.Date y java.sql.Date, también al manejo del GregorianCalendar.

El nombre del framework puede resultar un poco extraño en español, pero les aseguro que no es una broma, se llama Joda Time.
Con solo agregar el jar en el classpath tenemos acceso a una infinidad de opciones para trabajar con fechas, por ejemplo:

  • Sumar/restar días, meses o años a una fecha
  • Obtener la diferencia en días entre dos fechas
  • Saber el día de la semana de una fecha (lunes, martes, miércoles...)
Siempre trato de no usar el API directamente, por lo general tengo dos clases que las llamo:
  • DateOnly (soporta manejo de fecha)
  • DateTime (soporta manejo de fecha-hora)
las mismas delegan las invocaciones a una instancia particular del framework, así evito estar acoplado al producto.

Para integrar el manejo de fechas con Hibernate, implementé dos UserType, éstas clases son las que tienen la lógica de mapear los atributos DateOnly de las entidades con sus correspondientes columnas en la base de datos.

Mas adelante voy a tratar de subir algún ejemplo de código para bajar un poco mas en detalle.
Les dejo el link de la documentación oficial.

Hasta el próximo post!!

5 comentarios:

mar dijo...

Hola fede gracias por el articulo son cosas basicas pero siempre alguien las tiene (como yo)
ademas aprovecho para decirte y aportar algo que encontre por ahi si quieres publicalo sino no hay problema, es un foro de java en español parece bueno
a mi me gusta
aqui te dejo el link
Foro de java

Federico dijo...

Federico, esta muy bueno el blog, me ha simplificado bastante mis tareas a la hora de manejar fechas.Tienes razon con respecto a la informacion que hay en la web sobre este tema, son soluciones "retorcidas".
Un abrazo.
Federico.

Federico Varela dijo...

Federico, gracias por el comentario, me alegra que te haya servido.

Saludos

Anónimo dijo...

hola amigos tengo 4 problemas que no encuentro solucion
parecen faciles pero la verdad no se como hacerlo
1.-en netbeans tengo un formulario con 2 jtextField y un jButton
--en cada caja le ingreso una fecha
--por ejemplo
12/10/2010 ..en la primera caja
13/12/2010 ..en la 2 caja
mi problema es como comparar estas fechas
en las cuales la primera fecha debe ser el antes de la segunda
o mejor dicho la segunda caja siempre debe ser el mayor como lo hago??
algo asi

boton..
if(this.jtextField1.getText()<this.jtextField2.getText())
javax.swing.JOptionPane.showMessageDialog(null, "ok es correpto");
else
javax.swing.JOptionPane.showMessageDialog(null, "mal la primera fecha debe ser menor");



2.-problema en un form de netbeans tengo 3 jTextField y boton

ingreso una fecha 08/09/2010 ..en la 1
ingreso 2... en la 2
y en la tercera me debe mostrar el aumento de dias asi: 10/09/2010
como lo hago???

3.-problema en un form de netbeans tengo un jTextfield y un boton
ingreso una fecha en la caja..13/09/2010 apreto el boton y me debe salir el
nombre del dia de esa fecha es decir si 13..es lunes,o martes ...o domingo
como lo hago???

4.-problema lo mismo que la primera pero en horas
08:00 am en la primera caja
10:00 am en la segunda caja
siempre la 1 hora debe ser el antes que la segunda como lo hago??

muchas gracias por su atencion lo he intentado pero no puedo hacerlo
he buscado informacion en otros amigos pero no sale ...
soy nuevo en java y se que me falta bastante ..
cuelquier informacion por aqui o si no ivan_christian@hotmail.com

Anónimo dijo...

hola federico muy bueno tu blog.
pero necesito una ayuda, estoy realizando un sistema y necesito ingresar 2 fechas en formato dd/mm/yyyy y que devuelva una lista de personas que fueron atendidas en ese rango.
estoy trabajando con jpa,Hibernatte y mysql. en la parte visual estoy trajando con jsp mas bien con una libreria llamada Primefaces.
mi problema es pasar por parametro ambas fechas y realizar la consulta.las fechas estan guardadas en formato yyyy/mm/dd en la BD.si pudieras contestarme estaria agradecido de por vida ya que con esta consulta termino el trabajo final y me recibo.mi correo es carlosdiaz_66@hotmail.com