有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

所以,在服务器/机器重启时,我的时区变旧了。有没有什么方法可以通过java实现这一点,或者我需要依赖于运行时。getRuntime()。exec(“操作系统命令”)

注意:在这个场景中,时区将是特定于用户的(用户将定义自己的时区)。不同的实例可能有不同的时区


共 (3) 个答案

  1. # 1 楼答案

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

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

    I need to change OS timezone from java.

    不可能使用捆绑的Java类。据我所知,Java的任何实现都不会为Java应用程序提供这种能力

    您可以从Java中调用一些本机应用程序或实用程序,以更改主机操作系统时区设置。但是您必须找到这样一个实用程序,并设置从Java到本机代码的桥接调用。或者您可以execute a shell script更改操作系统设置

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

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

    顺便说一下,请注意Joda-Time项目现在处于维护模式。它的创建者斯蒂芬·科尔伯恩(Stephen Colebourne)继续在java中创建了它的继任者。JSR310定义的时间类,现在与Java8和更高版本捆绑在一起

  2. # 2 楼答案

    假设您具有根权限,这将更改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。您不需要为此提升权限

  3. # 3 楼答案

    这是一个可能的答案:

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