如何正确设置JVM TimeZone

Kus*_*yal 126 java timezone jvm jdk1.5 windows-server-2008

我正在尝试运行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());
    }
}
Run Code Online (Sandbox Code Playgroud)

这是输出

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

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

任何想法都将受到高度赞赏.

Boz*_*sov 201

你可以传递JVM这个参数

-Duser.timezone
Run Code Online (Sandbox Code Playgroud)

例如

-Duser.timezone=Europe/Sofia
Run Code Online (Sandbox Code Playgroud)

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

  • TZ 的时区列表在这里:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones。使用时区名称比偏移更好,因为它可以处理夏令时。 (3认同)
  • 我正在尝试使用此参数启动 JVM,但似乎没有任何变化...如果我想在 UTC 上启动,我应该使用什么作为参数!? (2认同)
  • @Castanho -Duser.timezone = UTC为我工作 (2认同)

Ali*_*786 55

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

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Run Code Online (Sandbox Code Playgroud)

给你的

 TimeZone.setDefault(TimeZone.getTimeZone("Europe/Sofia"));
Run Code Online (Sandbox Code Playgroud)

  • “请注意,我不想从应用程序中设置时区。” (3认同)

小智 21

上面接受的答案是:

-Duser.timezone="Europe/Sofia" 
Run Code Online (Sandbox Code Playgroud)

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

-Duser.timezone=Europe/Sofia
Run Code Online (Sandbox Code Playgroud)

  • 这取决于所使用的外壳。 (3认同)
  • 我同意.我已经编辑了原始答案以删除引号. (2认同)

Vol*_*anT 10

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

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


小智 6

如果您使用的是Maven

mvn -Dexec.args="-Duser.timezone=Europe/Sofia ....."
Run Code Online (Sandbox Code Playgroud)


Ole*_*.V. 6

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

避免需要

无论您如何设置 JVM 默认时区,都很难确保没有其他人以不同方式设置它。它可以随时设置,无需从程序的另一部分或在同一 JVM 中运行的另一个程序通知。因此,在您的时间操作中明确您想要的时区,并且您将始终知道独立于 JVM 设置的内容。例子:

    System.out.println(ZonedDateTime.now(ZoneId.of("Asia/Dushanbe")));
Run Code Online (Sandbox Code Playgroud)

示例输出:

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

系统设置属性

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

    System.setProperty("user.timezone", "Australia/Tasmania");
    System.out.println(ZonedDateTime.now());
Run Code Online (Sandbox Code Playgroud)

这只是打印:

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

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

        System.setProperty("user.timezone", ZoneId.of("Australia/Tasmania").getId());
Run Code Online (Sandbox Code Playgroud)