Java 如何正确设置JVM时区

Java 如何正确设置JVM时区,java,jvm,windows-server-2008,timezone,jdk1.5,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 =

我试图运行一个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使用的时区应该是操作系统中指定的时区。(我没有发现JDK版本1.4和Microsoft Server 2003的其他服务器存在此问题)


任何想法都将不胜感激。

您可以将此参数传递给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”
到“我的电脑=>属性=>高级系统设置=>环境变量”下的系统变量

如果您已经为
JAVA\u TOOL\u OPTIONS
设置了一些其他属性,只需添加一个空格,然后插入属性字符串

如果您正在使用:


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

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-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());

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


例:
export TZ=Asia/Shanghai

Hm,这很奇怪。看起来像是JVM/OS错误或一些奇怪的错误配置。您如何调用
DateTest
类?@matt b:我正在从windows命令提示符编译并调用DateTest。但这只是一个测试类。最初的问题是IBM cognos server的一些ETL过程。我们只是想排除通过任何可能传递
-Duser.timezone
值的shell/batch脚本启动它。我们必须使用JDK DST时区更新工具-1.3.25(tzupdater)然后按照您的建议更改JVM参数,我们最终解决了这个问题。顺便说一下,时区信息由Windows存储在一些注册表中。我使用的更新程序也更新了注册表值。我正在尝试使用此参数启动JVM,但似乎没有任何更改。。。如果我想从UTC开始,我应该使用什么作为参数!?在我的应用程序中,我正在更改一些位置并获取这些位置的时区。使用时区我正在进一步处理。但是,当应用程序第一次启动时,我得到了正确的值。当我更改时区并将新时区设置为默认时区时,我没有得到正确的值。问题是什么?如何准确更改时区。我正在使用timezone.setDefault(timezone.getTimeZone(“my_time_zone”))更改时区;TZ的时区列表如下:。使用时区名称比偏移量更好,因为它可以处理夏令时。我尝试过,但它不起作用(jvm在intellij中执行),我同意。我已经编辑了原始答案以删除引号。这取决于使用的shell。“请注意,我不想从应用程序中设置时区。”
mvn spring boot:run-Drun.jvmArguments=“-Duser.timezone=UTC”
用于spring boot v1。
        System.setProperty("user.timezone", ZoneId.of("Australia/Tasmania").getId());