Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中更改操作系统时区?_Java_Timezone_Jodatime - Fatal编程技术网

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

如何在java中更改操作系统时区?,java,timezone,jodatime,Java,Timezone,Jodatime,我的java应用程序运行在Ubuntu上,我有一个用例,需要从java更改操作系统时区。我试图通过使用Joda和Java.util.Timezone来实现这一点。但看起来,它们只是改变了jvm时区,而不是实际的操作系统 所以,在服务器/机器重启时,我的时区变旧了。是否有任何方法可以通过java实现,或者我需要依赖Runtime.getRuntime.execos命令 注意:在这种情况下,时区将是用户特定的。用户将定义自己的时区。不同的实例可能有不同的时区。这是可能的答案: Calendar gm

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

所以,在服务器/机器重启时,我的时区变旧了。是否有任何方法可以通过java实现,或者我需要依赖Runtime.getRuntime.execos命令


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

这是可能的答案:

Calendar gmtTime = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
System.out.println(gmtTime.getTime());
保持其自己的默认时区,与主机操作系统时区设置不连接

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

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

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

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

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

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

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

假设您拥有根权限,这将更改Linux中的OS时区:

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。您不需要提升权限。

永久更改操作系统时区需要提升权限,特别是在Linux上,对/etc/localtime的写入访问权限。您不能仅从Java执行此操作,除非您的程序是以root权限执行的。您的程序具有该权限。如果您以提升的权限运行Java程序,则这可能是一个坏主意。你审计过了吗?如果这是产品代码,您是否考虑过您的客户可能需要对其进行审核?是的,如果您确信这是一个好主意,您需要依靠Runtime.getRuntime.execos命令或其他方式来操作操作系统。@OleV.V:不,您至少不需要使用Linux。请参阅my answer.OP。您可能希望更改其他应用程序(不一定是java应用程序)的操作系统时区。这是我的理解,但看起来,他们只是改变了jvm时区,而不是实际的OS=我希望其他每个程序都能得到新的时区,所以我认为这个问题与jvm没有严格的关系,也许我错了though@BackSlash我建议将此作为向问题作者澄清的请求发布。我同意这个问题还不清楚。是的,我想改变操作系统时区,这会影响服务器上运行的其他应用程序,而不仅仅是java。实际上,我的应用程序有一个专用的虚拟机。我现在不关心对其他应用程序的影响。时区是用户特定的,而不是应用程序特定的。不同的应用程序实例可能有不同的时区。