JDZ6中的TimeZone.setDefault更改

我只是注意到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 TimeZone that is * returned by the getDefault method. If zone * 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 TimeZone that is * returned by the getDefault method. If zone * 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); } 

搜索bug数据库实际上是个不错的主意:)

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

还有(重新说明):

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

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

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

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