java中的自定义和动态时区

时间:2009-09-21 12:26:15

标签: java timezone

我有一个在具有自定义时区的操作系统上运行的JSE 6应用程序。

TimeZone.getDefaultTimeZone()返回'GMT'作为时区,尽管这不正确。 java是否支持自定义时区?

另一个问题是时区配置(夏令时转换)可能会在应用程序运行时发生变化。

每次通话时TimeZone.getDefaultTimeZone()都会返回时区的更新版本吗?

4 个答案:

答案 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介绍了如何配置自定义区域。