如何正确设置JVM TimeZone

时间:2010-03-22 16:03:25

标签: java jvm windows-server-2008 timezone jdk1.5

我正在尝试运行Java程序,但它采用默认的GMT时区而不是OS定义的时区。我的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使用的时区应该是操作系统中指定的时区。 (我没有发现其他具有1.4版JDK和Microsoft Server 2003的服务器的问题。)

任何想法都会受到高度赞赏。

8 个答案:

答案 0 :(得分:183)

您可以传递JVM此参数

-Duser.timezone

例如

-Duser.timezone=Europe/Sofia

这应该可以解决问题。 设置环境变量TZ也可以在Linux上实现。

答案 1 :(得分:49)

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

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

致你的

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

答案 2 :(得分:20)

上面接受的答案:

-Duser.timezone="Europe/Sofia" 

完全不适合我。当我没有关于参数的引号时,我只能成功地更改了我的时区:

-Duser.timezone=Europe/Sofia

答案 3 :(得分:10)

在Windows 7和JDK6上,我必须将-Duser.timezone="Europe/Sofia"添加到位于"我的计算机=>属性=>高级系统设置=>环境下的JAVA_TOOL_OPTIONS系统变量变量&#34 ;.

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

答案 4 :(得分:3)

如果您使用Maven

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

答案 5 :(得分:2)

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

避免需要

无论您做什么来设置JVM默认时区,都很难确保没有其他人对它进行不同的设置。可以随时进行设置,而无需程序其他部分或运行在同一JVM中的另一个程序的通知。因此,在您的时间操作中,应明确说明所需的时区,并且您将始终知道与JVM设置无关的结果。示例:

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

示例输出:

  

2018-10-11T14:59:16.742020 + 05:00 [亚洲/杜尚别]

System.setProperty

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

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

这只是打印出来的:

  

2018-10-11T21:03:12.218959 + 11:00 [澳大利亚/塔斯马尼亚州]

如果要验证传递的字符串,请使用:

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

设置环境变量TZ也应该有效

例如:export TZ=Asia/Shanghai