Convirtiendo fechas entre zonas horarias

domingo, 6 de diciembre de 2009

En cierto proyecto en el que estoy involucrado tuve que convertir algunas fechas en el huso horario UTC (GMT) a la zona horaria CST (Tiempo del centro) que es el que usa la mayoría de los estados en México. Como el proyecto está enteramente basado en tecnología Java, me di a la tarea de encontrar formas de hacer esto con librerías para Java.

Encontré que hay algunas librerías, como las de Quartz, implementan alguna clase para la conversión de zonas horarias. Pero en mi caso, necesitaba no depender tanto de librerías de terceros o fuera del API de Java.

Encontré que con las clases TimeZone y DateFormat puedo hacer la conversión usando las siguientes sentencias.


public void cambiarZonaHoraria(Date fecha, String to) {
DateFormat dateFormat = new SimpleDateFormat();
TimeZone tz = TimeZone.getTimeZone(to);
dateFormat .setTimeZone(tz);
System.out.println(dateFormat.format(fecha));
}


Lo que se hace básicamente es

  • crear una instancia de SimpleDateFormat con el formato de fecha local
  • crear una instancia del TimeZone con el nombre corto de la zona horaria que se especifique por el parámetro "to"
  • se asigna la nueva zona horaria al objeto dateFormat
  • haciendo uso del método format() del objeto dateFormat se hace la conversión de nuestra fecha a una cadena que representa la nueva fecha en la zona horaria que hemos creado, y esta fecha se imprime en pantalla.
De la misma forma se pueden hacer conversiones entre distintos husos y zonas horarias.
Ahora, cabe señalar que para crear un TimeZone se usa el nombre corto de la zona horaria. Aquí dejo un listado de zonas horarias con sus nombres e IDs que he obtenido ejecutando este pequeño programa que encontré en Java Developers Almanac:

import java.util.Date;
import java.util.TimeZone;

public class ListadoZonasHorarias {

public static void main( String[] args ) {
Date fecha = new Date();
// Obtiene el ID de todas las zonas horarias
String[] zoneIds = TimeZone.getAvailableIDs();

System.out.println(" ID | Nombre corto | Nombre largo |Diferencia horaria \n");
for (int i=0; i<zoneIds.length; i++) {
// Ontiene el TimeZone dependiendo del ID e imprime el ID
TimeZone tz = TimeZone.getTimeZone(zoneIds[i]);
System.out.print(tz.getID() + "\t|");

// Obtiene e imprime el nombre corto y largo de la zona horaria
String shortName = tz.getDisplayName(tz.inDaylightTime(fecha), TimeZone.SHORT);
String longName = tz.getDisplayName(tz.inDaylightTime(fecha), TimeZone.LONG);
System.out.print(shortName + "\t\t|");
System.out.print(longName + "\t|");

// Obtiene e imprime la cantidad de horas de diferencia al huso GMT
int ro = tz.getRawOffset();
int horas = ro / (60*60*1000);
int minutos = Math.abs(ro / (60*1000)) % 60;
System.out.print(horas + ":" + minutos);
System.out.println();
}

}
}

Espero que les pueda servir como a mí. Saludos.

0 comentarios: