如何在java中更改操作系统时区?
我的java应用程序运行在Ubuntu上,我有一个用例,需要从java更改操作系统时区。我试图通过使用Joda和Java来实现这一点。util。时区。但看起来,它们只是改变了jvm时区,而不是实际的操作系统
所以,在服务器/机器重启时,我的时区变旧了。有没有什么方法可以通过java实现这一点,或者我需要依赖于运行时。getRuntime()。exec(“操作系统命令”)
注意:在这个场景中,时区将是特定于用户的(用户将定义自己的时区)。不同的实例可能有不同的时区
# 1 楼答案
JVM保持其自己的默认时区,与主机操作系统时区设置无关
大多数Java实现在启动时默认为主机操作系统的当前默认时区。或者,您可以将参数传递给JVM启动器以指定另一个时区。最后,对
TimeZone.setDefault
的调用会立即更改在该JVM中运行的所有应用程序的所有线程中所有代码的当前默认时区不可能使用捆绑的Java类。据我所知,Java的任何实现都不会为Java应用程序提供这种能力
您可以从Java中调用一些本机应用程序或实用程序,以更改主机操作系统时区设置。但是您必须找到这样一个实用程序,并设置从Java到本机代码的桥接调用。或者您可以execute a shell script更改操作系统设置
至于Java代码中的日期-时间处理,您不应该依赖于主机操作系统或JVM的默认时区。我建议始终将可选的^{} (或^{} )传递给各种日期时间方法。省略参数会导致隐式依赖JVM的当前默认时区。最好指定所需/预期的时区
顺便说一下,请注意Joda-Time项目现在处于维护模式。它的创建者斯蒂芬·科尔伯恩(Stephen Colebourne)继续在java中创建了它的继任者。JSR310定义的时间类,现在与Java8和更高版本捆绑在一起
# 2 楼答案
假设您具有根权限,这将更改Linux中的操作系统时区:
请注意,更改操作系统默认时区不会影响当前进程。还要注意,这是而不是便携式的
编辑:我支持Stephen C关于在提升权限下运行自定义代码的警告
编辑:制作一个符号链接可能更好,但两者都可以
编辑:要永久更改单个用户的时区,请将
export TZ='Asia/Tokyo'
写入启动脚本,如.bashrc
。您不需要为此提升权限# 3 楼答案
这是一个可能的答案: