Преобразование прошлой даты gregorianCalendar с часовым поясом в localDate возвращает плохое время - PullRequest
0 голосов
/ 18 марта 2019

Когда я конвертирую GregorianCalendar в LocalDate, у меня возникает эта проблема:

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

return 1945-10-01 что в порядке

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

вернуть ту же дату: 1945-10-01 чем НЕОК

Почему?

Мой часовой пояс - Прага.Когда я проверяю эта сторона + 2h должна быть до 18.11, а не до 10.1

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Вы можете просто пропустить преобразование часового пояса:

        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.)

0 голосов
/ 18 марта 2019

API времени Java использует База данных часовых поясов IANA . Согласно этому, сдвиг времени произошел 10.1:

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