【发布时间】:2009-09-21 12:26:14
【问题描述】:
我有一个在具有自定义时区的操作系统上运行的 JSE 6 应用程序。
TimeZone.getDefaultTimeZone() 返回 'GMT' 作为时区,尽管这是不正确的。
java是否支持自定义时区?
另一个问题是时区配置(夏令时转换)可能会在应用程序运行时发生变化。
TimeZone.getDefaultTimeZone() 会在每次通话时返回时区的更新版本吗?
【问题讨论】:
我有一个在具有自定义时区的操作系统上运行的 JSE 6 应用程序。
TimeZone.getDefaultTimeZone() 返回 'GMT' 作为时区,尽管这是不正确的。
java是否支持自定义时区?
另一个问题是时区配置(夏令时转换)可能会在应用程序运行时发生变化。
TimeZone.getDefaultTimeZone() 会在每次通话时返回时区的更新版本吗?
【问题讨论】:
您可以使用TimeZone.setDefaultTimeZone() 更改时区。但是,您需要在应用程序的正确位置执行此操作,因为默认时区存储在可继承的本地线程中。 (顺便说一下,这在 Javadocs 中没有记录!)
我不相信 Java 会在 JVM 运行时刷新时区信息(例如更新规则)。当然,它无法检测到系统的默认时区已更改,因为(在 Unix/Linux 上)默认时区是通过环境变量设置进行通信的,并且进程无法看到其父级环境变量的更改。
【讨论】:
Java 只理解非常简单的自定义区域格式,例如,
GMT+9:30
如果您有任何无法识别的内容,它将默认为 GMT。
当操作系统时区改变时,Java 的默认时区不会改变。您必须重新启动 JVM。它曾经在每次调用 getDefaultTimeZone() 时刷新时区,但我不知道为什么它从 Java 5 开始就停止这样做了。
Java 时区的另一个问题是 setDefaultTimezone() 仅在使用 SecurityManager 运行时才会影响调用线程。
【讨论】:
不是完整的答案,但是...:
TimeZone.getDefaultTimeZone() 会在每次调用时返回时区的更新版本吗?
您可以自己轻松地进行测试;编写一个小程序,每隔几秒左右打印一次TimeZone.getDefaultTimeZone()的结果,然后在程序运行时更改操作系统的时区设置,看看输出是否改变。
【讨论】:
java.util.TimeZone 的 Javadoc 描述了如何配置自定义区域。
【讨论】: