我有一个运行的简单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”)不起作用
现在我需要检测系统时区变化
根据最新的评论,我为您提供了一个解决方法。
问题或多或少是:JVM 进程不会注意到时区更改,因此询问 JVM 不会为您提供所需的信息。这就是为什么人们建议您编写一些本机 (C/C++) 代码,并从 JVM 中调用它来查询 Windows 内部。
这绝对应该有效,但是以稳健/正确的方式将所有元素整合在一起......将很困难(即使对于超出“初学者”水平的人来说)。
因此,还有一些其他想法:不要使用“本机”代码来查询时区。相反,您可以调用一些脚本来执行此操作;您 grep 其输出并更新您的设置。
您可以使用python来做到这一点,或者直接使用powershell来做到这一点。
因此,您的 Java 代码将使用 ProcessBuilder 来运行某些命令;然后您只需从该进程的输出流中读取即可获取具有当前(新)时区的字符串。
可能不是世界上最强大的解决方案;但至少:快速实施一些首次测试。
理论上,您还可以尝试运行Java类来打印时区;这样做的好处是可以免费获得新时区的真实 Java 名称!
当然,要记住的另一个方面是:您必须确保所有代码都知道时区可以更改!
| 归档时间: |
|
| 查看次数: |
423 次 |
| 最近记录: |