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



我有一个简单的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);

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

我读过一篇解释JVM时间问题的文章Java系统。getProperty("user.timezone")不工作

现在我需要检测系统时区更改

考虑到最新的评论,我为您提供了一个解决方案。

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

这应该是肯定的工作,但把所有的元素放在一起…以一种稳健/正确的方式将是困难的(即使对于超过"初学者"水平的人也是如此)。

因此,另一个想法是:不要使用"本机"代码来查询时区。相反,你可以调用一些脚本来做到这一点;您可以输出grep并更新您的设置。

你可以用python,或者直接用powershell。

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

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

理论上你也可以尝试运行一个Java类来打印时区;这将具有很好的优势,可以免费获得新时区的真正Java名称!

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

执行以下代码将时区重置为更新后的系统值:

    System.setProperty("user.timezone", "");
    TimeZone.setDefault(null);

最新更新