【问题标题】:Java daylight saving seems to be wrongJava夏令时似乎是错误的
【发布时间】:2019-03-26 12:05:56
【问题描述】:

自昨天(2018 年 10 月 21 日)以来,我一直在使用 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 而 America/Cuiaba 应该是 -04

有谁知道Java时区信息的来源是什么?我可以做些什么来解决这个问题?我知道我可以通过设置固定的 GMT 偏移量来修复它,但我不喜欢它。

【问题讨论】:

标签: java datetime dst


【解决方案1】:

Jon Skeet 发布的链接帮助我解决了我的问题。 Oracle 已更新最新版本的夏令时信息。更新JDK版本后,它按预期工作。

    2018-10-22T09:19:31.761-03:00[America/Sao_Paulo]
    2018-10-22T09:19:31.761-03:00[America/Sao_Paulo]
    2018-10-22T08:19:31.761-04:00[America/Cuiaba]
    2018-10-22T08:19:31.761-04:00[GMT-04:00]

【讨论】:

    【解决方案2】:

    Bug 修复不可用...小解决方法。

    DateTimeFormatter DT_FORMAT = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss XXX");
    int hours = (int) ((TimeZone.getDefault().getRawOffset() / (1000*60*60)) % 24);
    字符串 strGMT = "GMT" + ( hours
        

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 2017-08-16
      • 2018-10-04
      • 1970-01-01
      • 2012-11-25
      • 2014-04-26
      • 2013-08-03
      • 2016-08-06
      • 2020-03-21
      相关资源
      最近更新 更多