为了账号安全,请及时绑定邮箱和手机立即绑定

如何在java中更改操作系统时区?

如何在java中更改操作系统时区?

拉莫斯之舞 2023-07-13 17:40:46
我的 java 应用程序在 Ubuntu 上运行,我有一个需要从 java 更改操作系统时区的用例。我尝试使用 Joda 和 Java.util.Timezone 来实现这一目标。但看起来,他们只是改变了 jvm 时区,而不是实际的操作系统。因此,在服务器/机器重新启动时,我将使用旧时区。有什么方法可以从java实现这一点,或者我需要依赖Runtime.getRuntime().exec(“os命令”)?注意:在这种情况下,时区将是用户特定的(用户将定义自己的时区)。不同的实例可能有不同的时区。
查看完整描述

3 回答

?
海绵宝宝撒

TA贡献1809条经验 获得超8个赞

假设您拥有 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);

请注意,更改操作系统默认时区不会影响当前进程。另请注意,这不可移植。


创建符号链接可能会更好,但两者都应该有效。


要永久更改单个用户的时区,请export TZ='Asia/Tokyo'写入启动脚本,例如.bashrc. 您不需要为此提升权限。


查看完整回答
反对 回复 2023-07-13
?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

JVM维护自己的默认时区,与主机操作系统时区设置无关

大多数 Java 实现在启动时都默认使用主机操作系统当前的默认时区。或者,您可以将参数传递给 JVM 启动程序以指定另一个时区。最后,调用TimeZone.setDefault立即更改该 JVM 中运行的所有应用程序的所有线程中的所有代码的当前默认时区。

我需要从 java 更改操作系统时区。

无法使用捆绑的 Java 类。据我所知,没有任何 Java 实现能够为 Java 应用程序提供这种功能。

您也许能够从 Java 中调用一些本机应用程序或实用程序,这些应用程序或实用程序可能会更改主机操作系统时区设置。但您必须找到这样的实用程序,并设置从 Java 到本机代码的桥接调用。或者您可以执行 shell 脚本来更改操作系统设置。

至于 Java 代码中的日期时间处理,您不应依赖主机操作系统或 JVM 的默认时区。我建议始终将可选ZoneId(或ZoneOffset) 传递给各种日期时间方法。省略该参数会导致隐式依赖 JVM 当前的默认时区。最好指定您想要/预期的时区。

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = ZonedDateTime.now( z ) ;

顺便说一下,请注意Joda-Time项目现在处于维护模式。它的创建者 Stephen Colebourne 随后在JSR 310 定义的java.time类中创建了它的后继者,现在与 Java 8 及更高版本捆绑在一起。


查看完整回答
反对 回复 2023-07-13
?
UYOU

TA贡献1878条经验 获得超4个赞

这是可能的答案:

Calendar gmtTime = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
System.out.println(gmtTime.getTime());


查看完整回答
反对 回复 2023-07-13
  • 3 回答
  • 0 关注
  • 157 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信