Pregunta

Me acabo de dar cuenta de que el JDK 6 tiene un enfoque diferente para el establecimiento de una zona horaria por defecto de JDK5.

Anteriormente el nuevo valor predeterminado se almacena en una variable de subproceso local. Con JDK6 (Acabo de revisar 1.6.0.18) la aplicación ha cambiado, por lo que si el usuario puede escribir en la propiedad "user.timezone", o si no hay instalado ningún SecurityManager, la zona horaria cambia VM-ancho! De lo contrario un cambio local de subprocesos se produce.

¿Me equivoco? 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);
 }
¿Fue útil?

Solución

Búsqueda de la base de datos de errores era en realidad una idea bastante buena:)

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

y (re docs):

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

Resumen: JDK 1.5 era una excepción a la regla, con JDK 1.6 cosas vuelven a 'normal', que, de acuerdo con la documentación, es que un cambio zona horaria es VM amplia

.

Otros consejos

Esto fue probablemente hecho para corregir un error. Me busco bugs.sun.com para encontrar la razón de ello. (pistas podría también se encuentran en las notas de la versión . )

La documentación de la API para TimeZone.getDefault () afirma que "la fuente de la zona horaria por defecto puede variar con la aplicación." Si el código se basa en el comportamiento específico de la implementación de las clases de la API estándar (en este caso, que la zona horaria predeterminada se mantiene a un hilo nivel local), debe esperar que su código falla con las nuevas versiones de la máquina virtual o con máquinas virtuales de diferentes vendedores.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top