miércoles, 29 de abril de 2009

TIMEZONE en java

Bueno voy a explicar.. o a comentar masomenos la experiencia que tuve yo a la hora de encontrarme con el tema de los timezone y lo que yo entiendo por los timezone.

En primer lugar cabe destacar que el mundo tiene diferentes usos horarios.. todo parte del GMT-00 y luego se va moviendo para la derecha o para la izquierda restando o incremetando horas.
Es decir el GMT-00 que si no me equivoco seria londres, tiene una determinada hora supongamos en con las 6 pm.
en caso de movernos para el Oeste osea para Argentina por ejemplo ese gmt se va a ir restando es decir...
Argentina tiene un GMT-03 osea que se restarian 3 horas a el gmt-00 por lo cual si en el gmt-00 son las 6 pm, en argentina serian las 3 pm.

Llendo a lo relativo a JAVA.

la maquina virtual de java tiene seteada tambien una hora con su respectivo uso horario, que siempre toma la del sistema.

Osea si tenemos seteado el windows o linux, en argentina con una determinada hora y el huso horario america/buenos aires, vamos a tener seteada por defecto a la maquina virtual en gmt-03.

Entonces que pasa si estoy trabajando con una aplicacion, con la cual yo necesito manejarme con un uso horario distinto?
Por ejemplo quiero guardar en la BD siempre en GMT-0, porque se que despues esa BD va a ser accedida de distntos paises, que luego van a hacer las conversiones necesarias para pasar ese horario a su GMT correspondiente segun el pais.

Bueno en ese caso, entra en juego la clase de java TIMEZONE.
Que se usa de la siguiente manera.

//vamos a crear el timezone que queramos, en este caso queremos un timezone 00
TimeZone tz = TimeZone.getTimeZone("GMT-00");

//Voy a crear un objeto Calendar para poder manejar las fechas con un calendario y a este
//calendar en particular le voy a setear el timezone creado antes con gmt-0
Calendar cal = Calendar.getInstance(tz);

Bien hata aca todo barbaro, pero lo que nos fataria ahora seria formatear o representar
el horario de nuestra hora en gmt-00

Para eso hacemos lo siguiente.

// Obtengo un objeto DateFormat y le seteo tambien el gmt-0
DateFormat formater = DateFormat.getDateTimeInstance();
formater.setTimeZone(TimeZone.getTimeZone("GMT-0"));

Ya etamos en condiciones de imprimir la hora y fecha en gmt-0 o guardarla en la BD:

Imprimir:

System.out.println(formater.format( cal.getTime() );

Guardarlo en la BD

guardar(new Date( formater.format( cal.getTime())));


Una vez tuve un problema para guardar en la BD con el :
guardar(new Date( formater.format( cal.getTime())));

No se si sera porque el new Date esta deprecated o que, pero por las dudas para solucionar eso, se puede crear otro formater, y decirle en que formato se quiere la fecha ej:

SimpleDateFormat formater2 = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

y despues en vez de poner esta linea:

guardar(new Date( formater.format( cal.getTime())));

utilizo esta:

guardar(formater2.parse( formater.format( cal.getTime())));





Bueno espero que se haya entendido!