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