首页 > 解决方案 > 如何在java中更改操作系统时区?

问题描述

我的 java 应用程序在 Ubuntu 上运行,我有一个用例,我需要从 java 更改操作系统时区。我试图通过使用 Joda 和 Java.util.Timezone 来实现这一点。但似乎,他们只是改变了 jvm 时区,而不是实际的操作系统。

所以,在服务器/机器重启时,我正在使用旧时区。有什么方法可以从 java 实现,或者我需要依赖 Runtime.getRuntime().exec("os commands")?

注意:在这种情况下,时区将是用户特定的(用户将定义它自己的时区)。不同的实例可能有不同的时区。

标签: javatimezonejodatime

解决方案


假设您具有 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. 您不需要为此提升权限。


推荐阅读