JDZ6中的TimeZone.setDefault更改

时间:2010-02-01 13:03:31

标签: java timezone default jdk1.6 jdk1.5

我刚才注意到JDK 6设置默认TimeZone的方法与JDK5不同。

以前,新的默认值将存储在线程局部变量中。使用JDK6(我刚刚查看了1.6.0.18),实现已经改变,因此如果用户可以写入“user.timezone”属性,或者如果没有安装SecurityManager,则时区会在整个VM范围内发生变化!否则会发生线程局部更改。

我错了吗?这似乎是一个相当大的变化,我在网上找不到任何关于它的东西。

这是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);
  }
 }

之前(在JDK5中)它只是:

 /**
  * 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);
 }

3 个答案:

答案 0 :(得分:13)

搜索bug数据库实际上是一个好主意:)

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

以及(re docs):

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

总结:JDK 1.5是规则的一个例外,JDK 1.6的东西恢复到“正常”,根据文档的说法,时区变化是VM范围。

答案 1 :(得分:4)

这可能是为了解决一个错误。我会搜索bugs.sun.com以找到它的基本原理。 (也可以在release notes中找到线索。)

答案 2 :(得分:1)

TimeZone.getDefault()的API文档指出“默认TimeZone的来源可能因实现而异。”如果您的代码依赖于标准API类的特定于实现的行为(在这种情况下,默认时区保留在线程本地级别),则必须预期您的代码会因较新版本的VM或来自不同VM的VM而失败供应商。