我有一个简单的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
现在我需要检测系统时区变化
答案 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;