如何正确设置 JVM 时区

我正在尝试运行一个 Java 程序,但它采用的是默认的 GMT 时区,而不是操作系统定义的时区。我的 JDK 版本是1.5,操作系统是 Windows Server Enterprise (2007)

Windows 有一个指定的中心时区,但是当我运行以下程序时,它会给我一个 GMT 时间。

import java.util.Calendar;


public class DateTest
{
public static void main(String[] args)
{
Calendar now = Calendar.getInstance();
System.out.println(now.getTimeZone());
System.out.println(now.getTime());
}
}

这是输出

sun.util.calendar.ZoneInfo[id="GMT",
offset=0,
dstSavings=0,
useDaylight=false,
transitions=0,
lastRule=null]
Mon Mar 22 13:46:45 GMT 2010

请注意,我不想从应用程序设置时区。我希望 JVM 使用的时区应该是操作系统中指定的时区。(我没有在其他拥有 JDK 1.4版和 Microsoft Server 2003版的服务器上发现这个问题)。

如果你有任何想法,我将不胜感激。

262784 次浏览

您可以将这个参数传递给 JVM

-Duser.timezone

比如说

-Duser.timezone=Europe/Sofia

这个应该就行了。 在 Linux 上,设置环境变量 TZ 也可以达到同样的效果。

以上是公认的答案:

-Duser.timezone="Europe/Sofia"

对我来说没什么用。只有在参数周围没有引号的情况下,我才能成功地更改时区:

-Duser.timezone=Europe/Sofia

在 win7中,如果希望在 JRE 中将正确的时区设置为参数,则必须编辑存储在路径 c:\users\%username%\appdata\locallow\sun\java\deployment中的文件 deployment.properties,并添加字符串 deployment.javaws.jre.1.args=-Duser.timezone\=我的时区

在 Windows 7和 JDK6中,我必须将 -Duser.timezone="Europe/Sofia"添加到位于“ My computer = > Properties = > Advanced System Settings = > Environment Variables”下的 选项系统变量中。

如果已经为 JAVA_TOOL_OPTIONS设置了一些其他属性,只需添加一个空格,然后插入属性字符串。

如果你使用 玛文:

mvn -Dexec.args="-Duser.timezone=Europe/Sofia ....."

还可以使用以下代码设置代码中的默认时区。

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

敬你的

 TimeZone.setDefault(TimeZone.getTimeZone("Europe/Sofia"));

我认为其他答案中没有提到的两个选项:

避免需要

无论您如何设置 JVM 默认时区,都很难确保没有其他人对其进行不同的设置。它可以在任何时候设置,而不需要程序的另一部分或运行在同一 JVM 中的另一个程序的通知。因此,在您的时间操作中要明确指出您想要的时区,并且您总是知道您独立于 JVM 设置获得了什么。例如:

    System.out.println(ZonedDateTime.now(ZoneId.of("Asia/Dushanbe")));

输出示例:

2018年10月11日14:59:16.742020 + 05:00[亚洲/杜尚别]

System.setProperty

对于许多目的来说,以下方法并不是首选的方法,而且它肯定会被滥用。对于“扔掉”程序,我有时觉得它很实用。您还可以在 Java 中设置系统属性:

    System.setProperty("user.timezone", "Australia/Tasmania");
System.out.println(ZonedDateTime.now());

刚刚打印出来的:

2018-10-11时间21:03:12.218959 + 11:00[澳大利亚/塔斯曼尼亚]

如果希望对传递的字符串进行验证,请使用:

        System.setProperty("user.timezone", ZoneId.of("Australia/Tasmania").getId());

设定环境变量 TZ也应该可以

例: export TZ=Asia/Shanghai