我的生产服务器正在运行java8,我的开发框也是如此。我跑了这个......
public static void main(String[] args) {
TimeZone timeZone = TimeZone.getTimeZone("America/Santiago");
Calendar st = Calendar.getInstance(timeZone);
Calendar end = Calendar.getInstance(timeZone);
st.set(2008, Calendar.JANUARY, 1, 0, 0, 0);
end.set(2028, Calendar.DECEMBER, 31, 23, 59, 59);
String actualOffset=null;
ZonedDateTime timeActual = ZonedDateTime.ofInstant(st.toInstant(), timeZone.toZoneId());
ZonedDateTime lastTime = ZonedDateTime.ofInstant(end.toInstant(), timeZone.toZoneId());
do {
if (!timeActual.getOffset().getId().equals(actualOffset)) {
actualOffset=timeActual.getOffset().getId();
System.out.println("Offset changed. " + timeActual.get(ChronoField.DAY_OF_MONTH) + "/" + timeActual.get(ChronoField.MONTH_OF_YEAR) + "/" + timeActual.get(ChronoField.YEAR) + ". New value " + actualOffset);
}
timeActual = timeActual.plusDays(1);
} while (timeActual.isBefore(lastTime));
}
我加入了开发:
Offset changed. 1/1/2008. New value -03:00 Offset changed. 30/3/2008. New value -04:00 Offset changed. 12/10/2008. New value -03:00 ...
但如果我在生产中运行,我只有一行:
Offset changed. 1/1/2008. New value -03:00
发生了什么?我的生产服务器在docker下,可能是那个?
这可能是因为(至少)您的一个安装已经过时智利的时区数据。
从维基百科我们可以看到政治家近年来已经多次改变规则,这可以解释一些安装可能会有过时的时区数据。当政治家改变主意时,Java安装不会自动更新。
解决方案是使用Timezone Updater Tool更新Java安装的时区数据库。升级到最新的Java版本可能是另一种选择,如果您愿意,可以尝试。
链接