【问题标题】:custom and dynamic time zones in javajava中的自定义和动态时区
【发布时间】:2009-09-21 12:26:14
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java timezone


    【解决方案1】:

    您可以使用TimeZone.setDefaultTimeZone() 更改时区。但是,您需要在应用程序的正确位置执行此操作,因为默认时区存储在可继承的本地线程中。 (顺便说一下,这在 Javadocs 中没有记录!)

    我不相信 Java 会在 JVM 运行时刷新时区信息(例如更新规则)。当然,它无法检测到系统的默认时区已更改,因为(在 Unix/Linux 上)默认时区是通过环境变量设置进行通信的,并且进程无法看到其父级环境变量的更改。

    【讨论】:

      【解决方案2】:

      Java 只理解非常简单的自定义区域格式,例如,

        GMT+9:30
      

      如果您有任何无法识别的内容,它将默认为 GMT。

      当操作系统时区改变时,Java 的默认时区不会改变。您必须重新启动 JVM。它曾经在每次调用 getDefaultTimeZone() 时刷新时区,但我不知道为什么它从 Java 5 开始就停止这样做了。

      Java 时区的另一个问题是 setDefaultTimezone() 仅在使用 SecurityManager 运行时才会影响调用线程。

      【讨论】:

        【解决方案3】:

        不是完整的答案,但是...:

        TimeZone.getDefaultTimeZone() 会在每次调用时返回时区的更新版本吗?

        您可以自己轻松地进行测试;编写一个小程序,每隔几秒左右打印一次TimeZone.getDefaultTimeZone()的结果,然后在程序运行时更改操作系统的时区设置,看看输出是否改变。

        【讨论】:

          【解决方案4】:

          java.util.TimeZoneJavadoc 描述了如何配置自定义区域。

          【讨论】:

            猜你喜欢
            • 2020-01-02
            • 2018-12-26
            • 1970-01-01
            • 1970-01-01
            • 2020-04-27
            • 2018-05-10
            • 1970-01-01
            • 1970-01-01
            • 2011-12-18
            相关资源
            最近更新 更多