java - 如何在java中更改操作系统时区?
问题描述
我的 java 应用程序在 Ubuntu 上运行,我有一个用例,我需要从 java 更改操作系统时区。我试图通过使用 Joda 和 Java.util.Timezone 来实现这一点。但似乎,他们只是改变了 jvm 时区,而不是实际的操作系统。
所以,在服务器/机器重启时,我正在使用旧时区。有什么方法可以从 java 实现,或者我需要依赖 Runtime.getRuntime().exec("os commands")?
注意:在这种情况下,时区将是用户特定的(用户将定义它自己的时区)。不同的实例可能有不同的时区。
解决方案
假设您具有 root 权限,这将更改 Linux 中的操作系统时区:
import java.io.File;
import java.nio.file.Files;
import static java.nio.file.StandardCopyOption.COPY_ATTRIBUTES;
import static java.nio.file.StandardCopyOption.REPLACE_EXISTING;
// ...
String zone = "Asia/Tokyo";
File source = new File("/usr/share/zoneinfo/" + zone);
File dest = new File("/etc/localtime");
Files.copy(source.toPath(), dest.toPath(), REPLACE_EXISTING, COPY_ATTRIBUTES);
请注意,更改操作系统默认时区不会影响当前进程。另请注意,这不是便携式的。
编辑:我支持 Stephen C 关于在提升权限下运行自定义代码的警告。
编辑:做一个符号链接可能会更好,但任何一个都应该工作。
编辑:要永久更改单个用户的时区,请写入export TZ='Asia/Tokyo'
启动脚本,例如.bashrc
. 您不需要为此提升权限。
推荐阅读
- java - 避免在 servlet 之间共享静态变量
- unity3d - Unity3D:如何根据鼠标输入动态创建带有碰撞器的 3D 网格?
- javascript - 按两个值对多维数组进行分组
- sql - 如何在根据其他条件选择值时部分 GROUP BY 列?
- typo3 - 自 TYPO3 9.5.18 以来路由增强器中的错误
- terraform - 用于 Azure Key Vault 的 Terraform 和导出块版本的属性
- c++ - 数组大小模板扣除
- javascript - 弹跳球边界故障
- typescript - 如何获得对打字稿友好的服务工作者注册对象?
- python - 在每个任务之前进行一些设置的蝗虫方法