как разобрать OffsetTime для формата HHmmssZ - PullRequest
0 голосов
/ 12 января 2020

Я пытаюсь разобрать строку даты в формате "HHmmssZ",

OffsetTime.parse("115601Z", DateTimeFormatter.ofPattern("HHmmssZ")).toLocalTime()

, когда я проверяю ее, я получаю исключение:

java.time.format.DateTimeParseException: Text '112322Z' could not be parsed at index 6

    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    at java.time.OffsetTime.parse(OffsetTime.java:327)

Ответы [ 2 ]

1 голос
/ 12 января 2020

Все последующее вернет LocalTime со значением 11:56:01:

LocalTime.parse("115601Z", DateTimeFormatter.ofPattern("HHmmss'Z'"))
OffsetTime.parse("115601Z", DateTimeFormatter.ofPattern("HHmmssX")).toLocalTime()
OffsetTime.parse("115601Z", DateTimeFormatter.ofPattern("HHmmssXX")).toLocalTime()
OffsetTime.parse("115601Z", DateTimeFormatter.ofPattern("HHmmssXXX")).toLocalTime()
OffsetTime.parse("115601Z", DateTimeFormatter.ofPattern("HHmmssXXXX")).toLocalTime()
OffsetTime.parse("115601Z", DateTimeFormatter.ofPattern("HHmmssXXXXX")).toLocalTime()
OffsetTime.parse("115601Z", DateTimeFormatter.ofPattern("HHmmssZZZZZ")).toLocalTime()
1 голос
/ 12 января 2020

Используйте строчную букву шаблона X для смещения, которое может использовать Z для нуля

    DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HHmmssXXX");
    OffsetTime time = OffsetTime.parse("115601Z", timeFormatter);
    System.out.println(time);

Выходные данные из этого фрагмента:

11: 56: 01Z

Для преобразования в LocalTime просто используйте .toLocalTime(), как вы уже делаете.

Для буквы шаблона Z укажите смещение как +0000

Редактировать: Как вы упомянули в комментарии, противоположный способ исправить ситуацию - сохранить строку шаблона формата и проанализировать строку, которая соответствует требуемому формату:

    DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HHmmssZ");
    OffsetTime time = OffsetTime.parse("115601+0000", timeFormatter);

Результат такой же, как и раньше. Одна заглавная буква Z в строке шаблона формата соответствует (цитируя документацию):

… час и минута без двоеточия, например «+0130».

Ссылка

Документация DateTimeFormatter и шаблон букв.

...