我本地计算机的时区是 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获取/查看/更改系统的时区。
答案 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类,您将看到无论时区或偏移量相关,您都可以将ZoneId
或ZoneOffset
对象作为可选参数传递。就个人而言,我相信Java程序员如果需要这些参数而不是可选的话会更好,因为我们很多人都没有考虑时区和偏移的问题。