java.time.format.DateTimeParseException: не удалось проанализировать в индексе 0 - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь преобразовать строку в метку времени. моя строка содержит время и часовой пояс ('05: 03: 05.875 + 02: 00 '), но я получаю следующую ошибку:

ошибка

java.time.format.DateTimeParseException: текст '05: 03: 05.875 + 02: 00 ' невозможно проанализировать по индексу 0

код

 String timewithZone= "05:03:05.875+02:00";
DateTimeFormatter formatter=DateTimeFormatter.ISO_OFFSET_DATE_TIME;
final ZonedDateTime a2=ZonedDateTime.parse(timewithZone,formatter);

Ответы [ 4 ]

0 голосов
/ 04 июля 2018
    String timewithZone = "05:03:05.875+02:00";
    OffsetTime time = OffsetTime.parse(timewithZone);
    System.out.println("Parsed into " + time);

Это выводит

Разобрано в 05: 03: 05.875 + 02: 00

Ваша строка содержит время и смещение, но без даты. Это хорошо согласуется, ни с ISO_OFFSET_DATE_TIME, ни с ZonedDateTime, но с OffsetTime, редко используемым классом, который, я думаю, существует именно потому, что такое иногда происходит в XML.

Существует также встроенный форматер ISO_OFFSET_TIME, но, поскольку это формат по умолчанию для OffsetTime, нам не нужно его указывать.

0 голосов
/ 04 июля 2018

Вы не можете использовать DateTimeFormatter.ISO_OFFSET_DATE_TIME, потому что ваш формат даты не соответствует этому.

На самом деле у вас даже нет реальной даты, потому что нет компонента даты, только компонент времени. Вы можете определить свой собственный экземпляр SimpleDateFormat с форматом, который вы получаете, но вам придется учитывать тот факт, что эти данные не очень полезны без информации о дате. Например, это смещение на самом деле не говорит нам так много, потому что оно может быть в летнее время в некоторых регионах или нет. И это в значительной степени зависит от того, какой это фактический ДАТА, а не только от какого времени.

Вы должны будете выяснить, что поставщик этих данных даже имеет в виду, потому что сейчас у вас просто нет достаточно информации, чтобы действительно преобразовать это в правильную дату.

Если эти данные означают простую временную метку, используемую, например, для того, чтобы сказать, что "наш обеденный перерыв во всем мире в 12:30", тогда вы можете использовать класс LocalTime. Это был бы один из немногих случаев, когда такая временная строка без даты действительно полезна. Хотя у меня есть подозрение, что это не ваш сценарий.

0 голосов
/ 04 июля 2018

Обходной путь может быть

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss.SSSz");
String str = "05:03:05.875+02:00";
LocalTime time = LocalTime.parse(str, formatter);
System.out.println(time);

Я пробовал код в формате, который вы получаете,

Выход:

05: 03: 05,875

Это тот, кого вы ищете?

0 голосов
/ 04 июля 2018

Сбой, потому что в вашей строке нет токенов, связанных с датой. Посмотрите пример в официальной документации . Для того, чтобы это работало, вам нужно добавить данные года / месяца / дня:

String timewithZone= "2018-07-3T05:03:05.875+02:00";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...