Me acabo de dar cuenta de que JDK 6 tiene un enfoque diferente para establecer un TimeZone predeterminado que JDK5.TimeZone.setDefault cambios en JDK6
Anteriormente, el nuevo valor predeterminado se almacenaba en una variable local de subprocesos. Con JDK6 (acabo de revisar 1.6.0.18) la implementación ha cambiado, de modo que si el usuario puede escribir en la propiedad "user.timezone", o si no hay SecurityManager instalado, ¡la zona horaria cambia a toda la VM! De lo contrario, se produce un cambio local de subprocesos.
¿Estoy equivocado? Esto parece ser un cambio bastante drástico, y no pude encontrar nada en la web al respecto.
Este es 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);
}
}
tiempo 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);
}