如何通过命令行

时间:2017-02-20 11:12:09

标签: java date datetime jvm timezone

我本地计算机的时区是 HST 。但是JVM给了我CUT / UTC时区。我尝试使用 java -Duser.timezone = America / Adak示例,但它仅为Example.class设置HST。怎样/在哪里我看到/更改JVM的时区?

/ etc / sysconfig / clock 中的ZONE值仅指向HST时区。

class Example {
public static void main(String[] args) {
    System.out.println(java.util.TimeZone.getDefault());
} 
}

上面的代码给了我 UTC时区

我正在使用 CentOS vagrant box java 8

我可以使用 java -Duser.timezone = America / Adak

设置时区

使用上述声明我们在外部设置时区。但我们没有采用默认/机器的时区

我在问我们如何使用java获取/查看/更改系统的时区

2 个答案:

答案 0 :(得分:2)

您可以通过

查看JVM的时区
System.out.println(TimeZone.getDefault());

您可以在JVM调用中设置它,例如

java -Duser.timezone=HST ...

或以编程方式

TimeZone.setDefault(TimeZone.getTimeZone("HST"));

答案 1 :(得分:0)

通过调用ZoneId.systemDefault()来查看JVM的当前默认时区。

您没有解释主机操作系统(您没有描述)的默认时区与您的Vagrant框的默认时区。我对运行Java容器化并不了解,但我想你的Java实现(你还没有描述)正在从主机操作系统或容器中获取它的默认值。

始终指定所需/预期的区域

但事情就是这样:你不应该关心。您的Java编程绝不应隐式依赖JVM的当前默认时区。你的问题本身就是我的观点。

相反,请始终在代码中明确指定时区。

永远不要依赖默认区域

您永远不应该依赖默认值的另一个原因是它可以在运行时(!)期间随时由JVM中运行的任何应用程序的任何线程中的任何代码进行更改。

而是将您期望/预期的时区作为可选参数传递。

例如,要获取区域中的当前时刻:

ZoneId z = ZoneId.of( "America/Adak" );
ZonedDateTime zdt = ZonedDateTime( z );

查看整个java.time类,您将看到无论时区或偏移量相关,您都可以将ZoneIdZoneOffset对象作为可选参数传递。就个人而言,我相信Java程序员如果需要这些参数而不是可选的话会更好,因为我们很多人都没有考虑时区和偏移的问题。