Java欧洲/明斯克时区问题

ava*_*lon 5 java timezone

我编写了以下程序:

import sun.security.action.GetPropertyAction;

import java.security.AccessController;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class Main {

    public static void main(String[] args) {
        System.out.println(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss Z").format(new Date()));
        System.out.println(TimeZone.getDefault().getDisplayName());

        String country =AccessController.doPrivileged(new GetPropertyAction("user.country"));
        System.out.println(country);

        String javaHome=AccessController.doPrivileged(new GetPropertyAction("java.home"));
        System.out.println(javaHome);

    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我在计算机上设置了GMT + 3欧洲/明斯克时区。

如果我使用最新版本的JDK6运行该程序,则会看到它显示我的Java时区是委内瑞拉标准时间GMT + 4.30如果我在最新的JDK7版本上运行它,则它将显示巴西时区GMT-3,如果我运行它在最新的JDK8版本上,它向我显示了莫斯科时间GMT + 3。如果我在Win7计算机上选择了Volgograd GMT + 3时区,则该程序在所有Java版本中均可正常运行。那么这是Minsk时区的JDK中的错误吗?

Vad*_*zim 1

该问题的原因是,直到 2014 年,还没有专门的欧洲/明斯克时区(至少在 Windows 中)。

它是在2011 年2014 年俄罗斯和白俄罗斯多次修改 DST 和时区法律后才出现的。

请参阅相应的JDK-8017129JDK-8067758问题。

最新的 java 版本中已考虑了这些更改。较旧的 JDK 和 JRE 可能需要通过Timezone Updater Tool进行修补。

操作系统时区设置也必须更新。在 Windows 情况下,这意味着您需要安装KB2570791和至少KB2998527补丁。

还有一种替代解决方法,不需要上述修补。只需-Duser.timezone=GMT+3在所需工具或全局的 java 命令行参数中进行硬编码即可。在下一个法规发生变化之前,这一切都会很好地发挥作用。)

但切换到最新的 Java 8 也将受益于稳定性和性能的改进。