viernes, 30 de mayo de 2008

Obtener la fecha y hora exacta con Java aún con cambios de horario en nuestra zona horaria

Hace algún tiempo binario01 me comentó que tenía un problema con Java haciendo una aplicación en Eclipse. El problema consistía en que obtenía la fecha con la clase Date pero le devolvía la hora incorrecta ya que acababa de haber un cambio de horario en su país Venezuela.

Me he encontrado en algunas partes donde preguntan esta cuestión y, he también he visto que han entrado a este blog con esa misma duda aunque no entran al comentario donde respondí la forma de solucionar ésto, por tal motivo preferí crear este post.

La forma de resolver este problema es usando las clases Locale y Calendar. Transcribo el código que puse en mi respuesta a la duda:

Locale l = new Locale("es","VE");
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("America/Caracas"),l);
System.out.println("FECHA: " + cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH)+1) + "-" + cal.get(Calendar.DATE) + " " + cal.get(Calendar.HOUR) + ":" + cal.get(Calendar.MINUTE) + ":" + cal.get(Calendar.SECOND));

El código anterior se encarga de obtener la fecha y hora exacta de Venezuela con Java aun habiendo el cambio de horario y manda a imprimir a la salida estandar la fecha y hora.

Si por ejemplo, quisieran obtener la fecha y hora de México-Distrito Federal se podría obtener de la siguiente manera:

Locale l = new Locale("es","MX");
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("America/Mexico_City"),l);

Los argumentos que se especifican en la clase Locale son el idioma "es" y el código del país "MX" o "VE".
Los argumentos que le pasamos al método getTimeZone de la clase TimeZone son la región "America/Caracas" o "America/Mexico_City" y el objeto de la clase Locale que creamos previamente.

Si no saben el código de su país y su time zone, pueden ver este artículo donde les muestro como pueden obtener su zona horaria.

Espero que este código les sea de utilidad para obtener su fecha y hora correcta en Java.

9 comentarios:

jairo dijo...

De verdad muy util me ha resultado la solucion que has propuesto, hice la prueba y resulta que me dio la hora de venezuela pero sin restar la media hora, luego buscando consegui que hay que aplicar un parche a la jvm de java para tambien tome los cambios.

Pueden verlo en este link

http://java.sun.com/javase/tzupdater_README.html
y
aqui pueden hacer una prueba

http://blogs.sun.com/venezuela/

javoaxian dijo...

Gracias por tu tip, tienes razón, de hecho fue algo que sugería cuando me preguntaron sobre este problema.

miel dijo...

quiero un codigo quee reste dos horas por ejemplo:12:09-11:30

kain_raziel dijo...

Bueno esta muy bueno tu aporte pero tengo un problema quiero realizar operaciones con horas no se si se pueda realizar dicho proceso por ejemplo:

A las 11:30:50 sumarle 50 minutos más.

Espero me puedas ayudar con este pequeño problema y sigue así esta muy bueno tu blog.

Enmanuel M. dijo...

Manejarlos como milisegundos podria permitirte operaciones, aunque es un proceso largo y poco eficiente, es simple
Podrian simplemente usar getTimeInMillis() en ambas y restar las dos cifras luego divides por 3600000(los milisegundos en una hora) el resto lo multiplicas por 60 y tienes minutos y la fraccion la multiplicas por 60 y tienes segundos

Enmanuel M. dijo...

pensandolo mejor simplemente usa el metodo

public abstract void add(int field,
int amount)

donde field es el tipo de dato a restar usando los valores estaticos de la clase Calendar

naitsir dijo...

hola jovoaxian, esta bueno el código, pero tengo una gran duda, para esto dependemos del idioma y del código del país, es muy necesario esto?? qué pasa si pones un idioma que no tiene nada q ver con el país, por ejemplo

Locale l = new Locale("es","DE");

funcionaría igual?? para o es necesario que cree una base de datos con los idiomas de cada país??

por otro lado, la página que nos propones para obtener la zona horaria de nuestro país funciona a las mil maravillas, pero no habrá manera de hacer esto con java?? a partir del código del país obtener las zonas horarias o igual necesito crear una base de datos para esto??

saludos y gracias por la ayuda

Anónimo dijo...

Hola, tengo un problemita con la clase java.util.Date.
Obtengo fecha y hora de la bd, la paso a un Date, luego utilizo:
Date date = DateUtils.trucate(date, Calendar.DATE) para obtener solo la fecha. La cuestion es que para fechas que caen en el cambio de horario al hacer el truncamiento me queda una hora de mas. Ej: 10/10/2010 03:00:55 --> 10/10/2010 01:00:00.
Intente hacerlo de otras formas sin utilizar DateUtils de apache pero llego al mismo resultado. El problema lo tengo en la clase java.util.Date, como se que trunque la hora cuando lo vuelvo a asignar al Date me guarda la fecha con una hora de mas.
Espero sus comentarios.

Slds.

Alejandro.

boyprimeravez dijo...

Oye disculpa queria algo de informacion en cuanto a como insertaste el google calendar, me interesa mucho. Ya que es para un proyecto. Te agradeceria mucho si me enviaras algo de informacion a mi correo boyprimeravez@gmail.com