Изменение LocalDateTimeFormat для включения секунд и миллисекунд - PullRequest
0 голосов
/ 13 мая 2019

Согласно требованию, мой код должен добавлять дату из параметра ZonedDateTime и параметр Time from OffSetTime в этот формат, «гггг-ММ-дд ЧЧ: мм: сс.SSSz». Тем не менее, я не смог достичь этого

Я пробовал различные способы, включая приведенный ниже, с использованием DateTimeFormatter.

ZonedDateTime zonedDateTime = ZonedDateTime.parse("2019-05-23T09:00:00-05:00");
OffsetTime offsetTime = OffsetTime.parse("08:59:00-05:00");
LocalDateTime localDateTime = LocalDateTime.of(zonedDateTime.toLocalDate(), offsetTime.toLocalTime());
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSz");
String finalDate = localDateTime.format(formatter);

Я заметил, что: - код выдает «java.time.DateTimeException: невозможно извлечь значение: класс java.time.LocalDateTime» в localDateTime.format (formatter)

Ожидается, что DateTime в String будет выглядеть примерно так - "2019-05-23T08: 59: 00.000Z"

Любая помощь приветствуется, спасибо за ваше время.

1 Ответ

1 голос
/ 13 мая 2019

Четыре номера:

  • LocalDateTime не имеет никакой информации о часовом поясе, поэтому не используйте ее.

  • Даже если это так, у ваших входов есть только часовой пояс смещение , а не полный часовой пояс, поэтому для форматирования строки нельзя использовать z, поскольку для этого требуется часовой пояс имя . Вместо этого используйте XXX.

  • Так как входы смещены -05:00, вы не должны ожидать вывода с Z (Zulu), поскольку это означает +00:00, если вы не ожидаете, что время будет скорректировано на 5 часов.

  • Шаблон формата для года должен использовать uuuu, а не yyyy. См. uuuu против yyyy в DateTimeFormatter форматировании кодов шаблонов в Java?

Если вы хотите сохранить часовой пояс, измените код на:

ZonedDateTime zonedDateTime = ZonedDateTime.parse("2019-05-23T09:00:00-05:00");
OffsetTime offsetTime = OffsetTime.parse("08:59:00-05:00");
OffsetDateTime offsetDateTime = zonedDateTime.toLocalDate().atTime(offsetTime);

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSXXX");
System.out.println(offsetDateTime.format(formatter));
2019-05-23 08:59:00.000-05:00

Если вы вместо этого хотите использовать зулусское время, то есть UTC, с установленным временем, добавьте строку, чтобы выполнить настройку:

OffsetDateTime offsetDateTime = zonedDateTime.toLocalDate().atTime(offsetTime)
                                .withOffsetSameInstant(ZoneOffset.UTC);

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSXXX");
System.out.println(offsetDateTime.format(formatter));
2019-05-23 13:59:00.000Z
...