修改主机操作系统默认设置后,Java将检测时区

Siz*_*zen 5 java timezone

我有一个运行的简单Java Executor线程。这只是检测时区并显示。

代码如下:

ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor();
    exec.scheduleAtFixedRate(new Runnable() {
      @Override
      public void run() {

            TimeZone.setDefault(null);
            //get Calendar instance
            Calendar now = Calendar.getInstance();

            //get current TimeZone using getTimeZone method of Calendar class
            TimeZone timeZone = now.getTimeZone();

            //display current TimeZone using getDisplayName() method of TimeZone class
            System.out.println("Current TimeZone is : " + timeZone.getDisplayName());
            System.out.println( System.getProperty( "user.timezone" ) );

      }
    }, 0, 10, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

问题是,如果我使用控制面板单独手动修改时区,我的时区没有更新。

我读过一篇解释JVM时间问题的文章 Java System.getProperty(“ user.timezone”)不起作用

现在我需要检测系统时区变化

Gho*_*ica 2

根据最新的评论,我为您提供了一个解决方法。

问题或多或少是:JVM 进程不会注意到时区更改,因此询问 JVM 不会为您提供所需的信息。这就是为什么人们建议您编写一些本机 (C/C++) 代码,并从 JVM 中调用它来查询 Windows 内部。

这绝对应该有效,但是以稳健/正确的方式将所有元素整合在一起......将很困难(即使对于超出“初学者”水平的人来说)。

因此,还有一些其他想法:不要使用“本机”代码来查询时区。相反,您可以调用一些脚本来执行此操作;您 grep 其输出并更新您的设置。

您可以使用python来做到这一点,或者直接使用powershell来做到这一点。

因此,您的 Java 代码将使用 ProcessBuilder 来运行某些命令;然后您只需从该进程的输出流中读取即可获取具有当前(新)时区的字符串。

可能不是世界上最强大的解决方案;但至少:快速实施一些首次测试。

理论上,您还可以尝试运行Java类来打印时区;这样做的好处是可以免费获得新时区的真实 Java 名称!

当然,要记住的另一个方面是:您必须确保所有代码都知道时区可以更改!