2011-10-31 15 views
6

Tenemos una aplicación de utilidad simple que lee todos los datos de zona horaria utilizados en un JRE y lo muestra todo en una tabla simple. Necesitamos usar una versión anterior del JRE (6_24) para una próxima versión del producto (debido aparentemente a otros problemas), pero también debemos incluir actualizaciones de zonas horarias más nuevas en esa versión (que de otro modo estaría incluida en, digamos, 6_29) Ya estamos empaquetando un JRE privado que se instalará, por lo que obtener las actualizaciones de zona horaria en ese JRE privado usando el TZUpdater tool no es el problema - El problema es leer/verificar qué versión del tzdata (por ejemplo, tzdata2010o, tzdata2011k) está siendo lea con la aplicación de utilidad (es decir, qué versión se está utilizando en el JRE en el que se ejecuta la aplicación). La aplicación actualmente muestra JRE versión en la barra de título, pero con las actualizaciones de zona horaria, eso ya no es suficiente para determinar qué datos de zona horaria versión está en uso.Java: encuentre la versión de tzdata en uso, independientemente de la versión de JRE

He examinado la clase TimeZone, pero parece que no proporciona esta información; ¿tal vez haya una propiedad del sistema que contenga esta información? La herramienta TZUpdater sabe qué versión se está usando, por lo que debe estar disponible en alguna parte. No puedo imaginar que determinen analíticamente qué versión está en uso en la herramienta de actualización ... ¿Alguien sabe dónde ubicar esta información?

Respuesta

8

En uno de mis JRE, hay un archivo en JRE_PATH\lib\zi llamado ZoneInfoMappings. En la primera línea, muestra los datos que estás buscando.

Voy a buscar una forma menos hackish, actualizaré la respuesta si encuentro algo.

ACTUALIZACIÓN: Parece que no hay una API para obtener esta información. Sin embargo, el código en la clase sun.util.calendar.ZoneInfoFile muestra cómo analizarlo.

+0

Sí, esa es la carpeta que es reemplazado por TZUpdater, y me di cuenta (después de la publicación de la cuestión) que ZoneInfoMappings contiene esa línea, pero Notepad ++ muestra algunos otros datos/caracteres a su alrededor en esa primera línea que me hizo pensar que se necesitarían algunas cosas de hack para llegar a ella ... Así que espero que haya una mejor manera de llegar desde el JRE o alguien podría publicar el código para leer ese archivo/línea ... – johnny

+0

Respuesta actualizada. –

+0

usó el código aquí como un ejemplo para analizar esto: http://www.docjar.com/html/api/sun/util/calendar/ZoneInfoFile.java.html – johnny

1

Aquí es una cosa hacker que trabajó para mí en ambos JRE de IBM y Oracle:

public static void main(String args[]) throws Exception { 
    File f = new File(System.getProperty("java.home") + File.separator + "lib" + File.separator + "zi" + File.separator + "ZoneInfoMappings"); 
    if (f.exists()) { 
     FileInputStream fis = new FileInputStream(f); 
     byte[] buf = new byte[11]; 
     try { 
      fis.skip(11); 
      fis.read(buf); 
      System.out.print("Olson Database version is "); 
      System.out.println(new String(buf)); 
     } finally { 
      fis.close(); 
     } 
    }  
} 

Mi jre jdk1.6.0_29 dice tzdata2012i, y mi websphere7 JDK dice tzdata2011g

Puede google a los vea si su JDK está actualizado, y qué zonas tienen qué cambios.

1

En Java 8, puede utilizar ZoneRulesProvider.getVersions("UTC"):

El significado y el formato de la versión exacta es específica del proveedor. La versión debe seguir el orden lexicográfico, por lo tanto, el mapa devuelto se ordenará desde las reglas conocidas más antiguas hasta las reglas disponibles más recientes. El grupo predeterminado 'TZDB' utiliza la numeración de versiones que consiste en el año seguido de una letra, como '2009e' o '2012f'.

Ejemplo:

System.out.println(java.time.zone.ZoneRulesProvider.getVersions("UTC").lastEntry().getKey()); 

En mi Oracle Java 8u91, me sale:

2016a

Cuestiones relacionadas