JDK6 中的TimeZone.setDefault 更改

问题描述 投票:0回答:3

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

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

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

这是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);
 }
java timezone default java-6 java-5
3个回答
14
投票

搜索 Java Bug 数据库 实际上是个好主意:)

JDK-6352812:(tz)回归:JDK 1.5 TimeZone.setDefault() 与 JDK 1.4 和 Mustang 不一致

还有(重新文档):

JDK-6181786:(tz)TimeZone.getDefault() 和 TimeZone.setDefault() 的文档应该更清晰

总结:JDK 1.5 是该规则的一个例外,JDK 1.6 的情况又恢复到“正常”,根据文档,时区更改是在 VM 范围内的。


4
投票

这可能是为了修复错误。我会搜索 Java Bug Database 以找到其基本原理。 (线索也可以在发行说明中找到。)


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.