我编写了以下程序:
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);
}
}
然后我在电脑上设置了GMT+3欧洲/明斯克时区。
如果我用JDK6最新版本运行这个程序,我会发现它显示我在Java的时区是委内瑞拉标准时间GMT+4.30如果我在最新发布的JDK7上运行它,它会显示巴西时区GMT-3,如果我在最新发布的JDK8上运行它,它会显示莫斯科时间GMT+3。如果我在Win7计算机上选择伏尔加格勒GMT+3时区,该程序在所有版本的java中都能正常工作。那么,这是JDK中明斯克时区的一个错误吗?
问题的原因是,直到2014年,还没有专门的欧洲/明斯克时区(至少在Windows中是这样)。
它是在2011年和2014年俄罗斯和白俄罗斯的几项夏令时和时区法律发生变化后才出现的。
请参阅相应的JDK-8017129和JDK-8067758问题。
在最新的java版本中已经考虑到了这些变化。较旧的JDK和JRE可能需要通过时区更新工具进行修补。
操作系统时区设置也必须更新。在Windows的情况下,这意味着您需要安装KB2570791和至少KB2998527修补程序。
还有一种替代方法,不需要上述补丁。只需在所需工具的java命令行参数中或全局硬编码-Duser.timezone=GMT+3
。在下一个法规改变之前,这将一直有效。)
但切换到最新的Java8也将受益于稳定性和性能的提高。