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. 您不需要为此提升权限。
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 及更高版本捆绑在一起。
TA贡献1878条经验 获得超4个赞
这是可能的答案:
Calendar gmtTime = Calendar.getInstance(TimeZone.getTimeZone("GMT")); System.out.println(gmtTime.getTime());
添加回答
举报