自昨天(21/10/2018)起,我一直在遇到Java时区的一些问题。看来Java正在考虑在巴西实施夏令时,但实际上却没有。
我确定要创建以下测试
public static void main(String[] args) {
ZonedDateTime dateTime = LocalDateTime.now().atZone(ZoneId.systemDefault());
System.out.println(dateTime);
ZonedDateTime saoPaulo = dateTime.withZoneSameInstant(ZoneId.of("America/Sao_Paulo"));
ZonedDateTime cuiba = dateTime.withZoneSameInstant(ZoneId.of("America/Cuiaba"));
ZonedDateTime rightTime = dateTime.withZoneSameInstant(ZoneId.of("GMT-4"));
System.out.println(saoPaulo);
System.out.println(cuiba);
System.out.println(rightTime);
}
给出了以下输出
2018-10-22T09:55:34.473-02:00[America/Sao_Paulo]
2018-10-22T09:55:34.473-02:00[America/Sao_Paulo]
2018-10-22T08:55:34.473-03:00[America/Cuiaba]
2018-10-22T07:55:34.473-04:00[GMT-04:00]
这是错误的,因为到圣保罗的当前时区应该是-03,而美洲/库亚巴应该是-04
任何人都知道Java时区信息的来源是什么?有什么我可以解决的办法吗?我知道我可以通过设置固定的GMT偏移来修复它,但是我不喜欢它。
答案 0 :(得分:1)
Jon Skeet发布的链接帮助我解决了我的问题。 Oracle已在最新版本中更新了夏令时信息。更新JDK版本后,它可以按预期工作。
malloc
答案 1 :(得分:0)
无法使用错误修复...小的解决方法。
DateTimeFormatter DT_FORMAT = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss XXX"); int hours = (int) ((TimeZone.getDefault().getRawOffset() / (1000*60*60)) % 24); String strGMT = "GMT" + ( hours<0 ? hours : "+"+hours ); DT_FORMAT.format(ZonedDateTime.ofInstant(value, ZoneId.of(ZoneIdUtils.getZoneId())))