148

我正在尝试运行 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 的服务器存在此问题)。

任何想法将不胜感激。

4

8 回答 8

239

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

-Duser.timezone

例如

-Duser.timezone=Europe/Sofia

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

于 2010-03-22T16:10:39.343 回答
74

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

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

给你的

 TimeZone.setDefault(TimeZone.getTimeZone("Europe/Sofia"));
于 2016-05-12T11:23:03.987 回答
24

上面接受的答案:

-Duser.timezone="Europe/Sofia" 

不完全适合我。只有当我在参数周围没有引号时,我才能成功更改我的时区:

-Duser.timezone=Europe/Sofia
于 2013-12-04T19:31:35.497 回答
12

在 Windows 7 和 JDK6 上,我必须添加-Duser.timezone="Europe/Sofia"到位于“我的电脑 => 属性 => 高级系统设置 => 环境变量”下的JAVA_TOOL_OPTIONS系统变量。

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

于 2014-06-17T13:54:56.343 回答
7

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

避免需要

无论您如何设置 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());
于 2018-10-11T10:04:03.280 回答
6

如果您使用的是Maven

mvn -Dexec.args="-Duser.timezone=Europe/Sofia ....."
于 2014-08-19T10:59:11.317 回答
1

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

前任:export TZ=Asia/Shanghai

于 2020-10-18T15:33:13.257 回答
0

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

于 2013-12-18T11:04:05.717 回答