Java夏时制似乎是错误的

时间:2018-10-22 12:05:28

标签: java datetime dst

自昨天(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偏移来修复它,但是我不喜欢它。

2 个答案:

答案 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())))