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