将带时区的过去 gregorianCalendar 日期转换为 localDate return 错误时间

Converting past gregorianCalendar date with timezone to localDate return bad time

当我将 GregorianCalendar 转换为 LocalDate 时,我遇到了这个问题:

System.out.println(((GregorianCalendar) DatatypeConverter.parseDateTime("1945-10-01+02:00")).toZonedDateTime()
        .withZoneSameInstant(ZoneId.systemDefault()).toLocalDate());

return1945-10-01什么都行

    System.out.println(((GregorianCalendar) DatatypeConverter.parseDateTime("1945-10-02+02:00")).toZonedDateTime()
            .withZoneSameInstant(ZoneId.systemDefault()).toLocalDate());

return 同一日期:1945-10-01 哪里不对

为什么?

我的时区是布拉格。当我检查 this side +2h 应该到 18.11 而不是到 10.1

Java时间API依赖IANA Time Zone Database。根据它,时间偏移发生在10.1:

Rule    Czech   1945    only    -   Oct  1  2:00s   0   -

您可以省略时区转换:

        System.out.println(((GregorianCalendar) DatatypeConverter.parseDateTime("1945-10-02+02:00")).toZonedDateTime()
                .toLocalDate());

1945-10-02

或者在没有 DatatypeConverter 的情况下解析自己:

        System.out.println(DateTimeFormatter.ISO_OFFSET_DATE
                .parse("1945-10-02+02:00", LocalDate::from));

1945-10-02

(想知道 IANA 或 timeanddate.com 是否正确;我通常对两者都非常有信心。一种可能的解释是 timeanddate.com 依赖于较旧的 IANA 数据库版本。)