将带有时区的gregorianCalendar日期转换为localDate会返回错误的时间

问题描述 投票:0回答:2

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

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

什么是好的,返回1945-10-01

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

返回相同日期:1945-10-01什么不行

为什么?

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

java localdate
2个回答
0
投票

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

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

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数据库版本,可能会有一个解释。)

© www.soinside.com 2019 - 2024. All rights reserved.