【问题标题】:how to set timezone for jvm through command line如何通过命令行为jvm设置时区
【发布时间】:2017-02-20 11:12:09
【问题描述】:

我本地机器的时区是HST。但是 JVM 给了我 CUT/UTC 时区。我尝试使用 java -Duser.timezone=America/Adak Example,但它仅为 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 boxjava 8

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

设置时区

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

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

【问题讨论】:

  • “JVM 给我 CUT/UTC 时区”究竟是什么意思?显示您的代码。
  • 导入 java.util.TimeZone;类示例 { public static void main(String[] args) { System.out.println(TimeZone.getDefault()); } } 上面的代码给了我 UTC 时区。我正在使用 CentOS。我可以通过使用上面的语句使用 java -Duser.timezone=America/Adak 设置时区,我们在外部设置时区。但是我们没有采用默认/机器的时区。我在问我们如何获得时区。

标签: java date datetime jvm timezone


【解决方案1】:

您可以通过

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

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

java -Duser.timezone=HST ...

或通过类似的方式以编程方式

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

【讨论】:

  • 这只是针对特定文件吧?,我想更改jvm的配置
  • @MaharjunM 我不明白“针对特定文件”是什么意思。用于java调用启动的JVM进程。
  • 哈。一样。我们调用 java -Duser.timezone=HST 对吗?
  • @MaharjunM 不完全是。你打电话给java -Duser.timezone <classname>。见Running a Java application via a main class了解文件名和类名的区别。
  • 能否请您再看一遍这个问题。我又加了点。
【解决方案2】:

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

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

始终指定您想要/预期的区域

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

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

永远不要依赖默认区域

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

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

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

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

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

【讨论】:

  • 是的,我们可以在运行时更改时区。但我想在第一次尝试时将 JVM 的时区设置为我系统的时区。但是 ZoneId.systemDefault() 给了我 UTC 时区。我的系统在 HST 时区
  • @MaharjunM 你还没有准确解释你是如何获得默认区域的报告的,你没有发布任何代码,你没有透露你正在使用什么操作系统,也没有指定什么版本您正在使用什么 Java 实现。我无法想象你希望我们如何帮助你。是时候结束这个问题了。
  • 导入 java.util.TimeZone;类示例 { public static void main(String[] args) { System.out.println(TimeZone.getDefault()); } } 上面的代码给了我 UTC 时区。我正在使用 CentOS。我可以使用上面的语句使用 java -Duser.timezone=America/Adak 设置时区,我们是在外部设置时区。但是我们没有采用默认/机器的时区。我在问我们如何获得时区。
  • @MaharjunM 将更多信息发布为对问题的编辑而不是评论。
  • 我添加了这个问题。你能再检查一次吗。如果您需要更清楚,那么我可以添加详细信息。
猜你喜欢
  • 2010-10-15
  • 1970-01-01
  • 2013-05-15
  • 2013-08-26
  • 2012-06-09
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 2022-09-29
相关资源
最近更新 更多