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

时间:2016-10-19 10:47:37

标签: 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);

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

我已阅读一篇解释JVM时间问题的帖子 Java System.getProperty( "user.timezone" ) does not work

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

2 个答案:

答案 0 :(得分:2)

鉴于最新评论,我有一个解决方法。

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

这应该绝对有效,但是以强有力/正确的方式将所有元素集中在一起将是困难的(即使是超出初学者和等级的人)。

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

您可以使用python,也可以直接使用powershell

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

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

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

当然,请记住其他方面:您必须确保所有您的代码都知道时区可能会发生变化!

答案 1 :(得分:1)

我找到了解决方案。 执行以下代码可帮助我重置时区。

    TimeZone.setDefault(null);

var mekBldr = {
  mecha: {
    rightLimbs: {
        legs: {
            rightleg01: {
                cost: 0,
                classification: ''
            }
        }
    },
    leftLimbs: {
        legs: {
            leftleg01: {
                cost: 0,
                classification: ''
            }
        }
    }
  }
};

var part1 = 'leftLimbs';

var part2 = 'legs';

var multi = part1[part2];

// the goal: mekBldr.mecha.leftLimbs.legs.leftleg01.cost = 5;

mekBldr.mecha[multi].leftleg01.cost = 5;