我刚刚注意到 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); }