Java 可以通过 Timezone 获取时区,但是通过 Timezone 获取的时区是 JVM 初始化时保存的时区,并不是操作系统所设置的时区。当修改过操作系统的时区后,JVM 并不会同步更新。Timezone 获取时区的代码如下:
// 获取 JVM 启动时获取的时区
TimeZone.getDefault();
// 获取任意指定区域的时区
String[] zoneIDs = TimeZone.getAvailableIDs();
for(String zoneID: zoneIDs) {
TimeZone.getTimeZone(zoneID);
}
当修改了操作系统的时区后,但JVM 并不会同步更新,因此直接通过 Timezone 获取默认时区并不是修改后的时区。若要程序获取修改后的操作系统时区,则可以这样修改:
// 将获取默认时区的两个前置条件设置为 false, 令其获取系统时间,原理见后面分析
synchronized (TimeZone.class) {
TimeZone.setDefault(null);
System.setProperty("user.timezone", "");
TimeZone.getDefault();
}
这么做的原因是,我们需要调用Timezone 的本地方法 getSystemTimeZoneID(String javaHome),请看源码
/**
* Returns the reference to the default TimeZone object. Th