我编写了以下程序:
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中的错误吗?
该问题的原因是,直到 2014 年,还没有专门的欧洲/明斯克时区(至少在 Windows 中)。
它是在2011 年和2014 年俄罗斯和白俄罗斯多次修改 DST 和时区法律后才出现的。
请参阅相应的JDK-8017129和JDK-8067758问题。
最新的 java 版本中已考虑了这些更改。较旧的 JDK 和 JRE 可能需要通过Timezone Updater Tool进行修补。
操作系统时区设置也必须更新。在 Windows 情况下,这意味着您需要安装KB2570791和至少KB2998527补丁。
还有一种替代解决方法,不需要上述修补。只需-Duser.timezone=GMT+3在所需工具或全局的 java 命令行参数中进行硬编码即可。在下一个法规发生变化之前,这一切都会很好地发挥作用。)
但切换到最新的 Java 8 也将受益于稳定性和性能的改进。