【发布时间】:2019-02-15 20:13:19
【问题描述】:
我的生产服务器正在运行 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));
}
我参加了开发:
偏移量已更改。 2008 年 1 月 1 日。新值 -03:00 偏移量已更改。 2008 年 3 月 3 日。新值 -04:00 偏移量已更改。 2008 年 12 月 10 日。新值 -03:00 ...但如果我在生产中运行,我只会得到一行:
偏移量已更改。 2008 年 1 月 1 日。新值 -03:00发生了什么?我的生产服务器在docker下,可能是那个?
【问题讨论】:
-
你检查过图片的偏移量和默认时区吗?
-
可能是其中一个环境需要更新时区数据库? Timezone Updater Tool
-
顺便说一句,由于您使用的是 Java 8 和
ZonedDateTime并且因此内置了其他 java.time 类,我建议您完全避免使用过时的类Calendar和TimeZone。例如使用ZoneId.of("America/Santiago")和ZonedDateTime.of(2008, 1, 1, 0, 0, 0)。 -
嗯……这更奇怪了。它工作正常,直到 2014 / 九月......从那里开始,偏移计算不再起作用。 DST 更改是否可能在某个历史记录表中?
-
FWIW 在我的 Java 1.8.0_60 上我在 2008 年和 2014 年(含)之间进行了 15 次更改。在 1.8.0_131 上,我在 2008 年和 2028 年之间进行了 41 次更改。