java timezone default jdk1.6 jdk1.5

java - Cambios en TimeZone.setDefault en JDK6



jdk1.6 jdk1.5 (3)

Buscar la base de datos de errores fue realmente una buena idea :)

http://bugs.sun.com/view_bug.do?bug_id=6352812

y también (re docs):

http://bugs.sun.com/view_bug.do?bug_id=6181786

Resumen: JDK 1.5 fue una excepción a la regla, con JDK 1.6 las cosas han vuelto a ser "normales", lo que, según los documentos, es que un cambio de zona horaria es todo el VM.

Acabo de darme cuenta de que JDK 6 tiene un enfoque diferente para establecer una Zona horaria predeterminada que JDK5.

Anteriormente, el nuevo valor predeterminado se almacenaría en una variable de subproceso local. Con JDK6 (acabo de revisar 1.6.0.18), la implementación ha cambiado, por lo que si el usuario puede escribir en la propiedad "user.timezone", o si no hay un SecurityManager instalado, ¡la zona horaria cambia en toda la máquina virtual! De lo contrario se produce un cambio de subproceso local.

¿Me equivoco? Esto parece ser un cambio drástico, y no pude encontrar nada en la web al respecto.

Aquí está el código JDK6:

private static boolean hasPermission() { boolean hasPermission = true; SecurityManager sm = System.getSecurityManager(); if (sm != null) { try { sm.checkPermission(new PropertyPermission("user.timezone", "write")); } catch (SecurityException e) { hasPermission = false; } } return hasPermission; } /** * Sets the <code>TimeZone</code> that is * returned by the <code>getDefault</code> method. If <code>zone</code> * is null, reset the default to the value it had originally when the * VM first started. * @param zone the new default time zone * @see #getDefault */ public static void setDefault(TimeZone zone) { if (hasPermission()) { synchronized (TimeZone.class) { defaultTimeZone = zone; defaultZoneTL.set(null); } } else { defaultZoneTL.set(zone); } }

mientras que antes (en JDK5) era simplemente:

/** * Sets the <code>TimeZone</code> that is * returned by the <code>getDefault</code> method. If <code>zone</code> * is null, reset the default to the value it had originally when the * VM first started. * @param zone the new default time zone * @see #getDefault */ public static synchronized void setDefault(TimeZone zone) { defaultZoneTL.set(zone); }



La documentación de la API para TimeZone.getDefault () indica que "el origen de la Zona horaria predeterminada puede variar con la implementación". Si su código se basa en el comportamiento específico de la implementación de las clases API estándar (en este caso, la zona horaria predeterminada se mantiene en un nivel local de subprocesos), debe esperar que su código falle con versiones más nuevas de la VM o con VM de diferentes vendedores.