将过去的gregorianCalendar日期和时区转换为localDate返回错误的时间

时间:2019-03-18 09:34:49

标签: java localdate

当我将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

2 个答案:

答案 0 :(得分:0)

Java Time API依赖于IANA Time Zone Database。据此,时移发生在10.1:

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

答案 1 :(得分: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数据库版本。)