Странные результаты при преобразовании XMLGregorianCalendar в LocalDateTime

Я пытаюсь преобразовать XMLGregorianCalendarObject в LocalDateTime и получаю необычные результаты. Я уже пробовал решения в этом посте и этом посте.

Здесь я делаю несколько предположений, в которых я могу ошибаться:

1) аргумент xmlDate - это UTC

2) возвращаемое значение PST

private LocalDateTime convertDate(XMLGregorianCalendar xmlDate) {

   GregorianCalendar gc = xmlDate.toGregorianCalendar();
   ZonedDateTime zdt = gc.toZonedDateTime();
   LocalDateTime localDate = zdt.withZoneSameInstant(ZoneId.of("America/Los_Angeles")).toLocalDateTime();

   return localDate;
   }

Вывод точно такой же, как ввод:

XMLGregorianCalendar xmlDate: "2019-09-03T13: 22: 38.436-07: 00"

LocalDateTime localDate: "2019-09-03T13: 22: 38"

Кроме того, это не работает (тот же метод, другой синтаксис):

private LocalDateTime convertDate(XMLGregorianCalendar xmlDate) {
    ZonedDateTime utcZoned = xmlDate.toGregorianCalendar().toZonedDateTime().withZoneSameInstant(ZoneId.of("America/Los_Angeles"));
    LocalDateTime localDate = utcZoned.toLocalDateTime();

    return localDate;
}

Результат совпадает с первым фрагментом кода.

Я думаю, что моя проблема где-то в методе withZoneSameInstant(). Странно то, что когда я добавляю другой код часового пояса в параметр, происходит конверсия does. Попробуйте это с "Pacific/Auckland".

Что я делаю неправильно?

+2
источник поделиться
1 ответ

Ваше первое предположение неверно:

1) аргумент xmlDate - это UTC

-07:00 в конце 2019-09-03T13:22:38.436-07:00 является смещением от UTC. Смещение согласуется с часовым поясом Америка/Лос-Анджелес (тихоокеанское летнее время). Java распознает это, поэтому, когда вы конвертируете в America/Los_Angeles, это не меняет время. Когда вы конвертируете в Pacific/Auckland, это так.

Я считаю, что ваш код правильный.

+3
источник

Посмотрите другие вопросы по меткам или Задайте вопрос