Разобрать дату и время из строки со смещением с часами из одной цифры - PullRequest
0 голосов
/ 15 мая 2018

Мне нужно разобрать дату в Java.У меня есть строковое значение 2018-05-15 09:32:51.550082 +3:00, и мне нужно проанализировать его в дату-время.Я попытался выполнить синтаксический анализ до ZonedDateTime, но получил ошибку по индексу 10. Попытался выполнить синтаксический анализ с DateTimeFormatter parser 'гггг-мм-дд ЧЧ: мм: ss.SSSSSS Z' и получил ошибку по индексу 26. Очевидно, мойСмещение UTC +3:00 не может быть проанализировано.Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Java 9 и более поздние версии позволяют:

    String dateTimeString = "2018-05-15 09:32:51.550082 +3:00";
    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendPattern("uuuu-MM-dd HH:mm:ss.SSSSSS ")
            .appendOffset("+H:MM:ss", "+0:00")
            .toFormatter();
    OffsetDateTime dateTime = OffsetDateTime.parse(dateTimeString, formatter);
    System.out.println(dateTime);

Выход:

2018-05-15T09: 32: 51,550082 + 03: 00

Для Java 8 или ThreeTen Backport вам, вероятно, придется подготовить строку даты-времени перед ее анализом:

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SSSSSS XXX");
    dateTimeString 
            = dateTimeString.replaceFirst("([+-])(\\d(?::\\d\\d){0,2})$", "$10$2");

Остальное как и прежде и дает тот же результат. Вызов replaceFirst вставляет 0 между + и 3:00, но только если часы были только одной цифрой. Регулярное выражение трудно читать, поэтому вы предпочтете решение Java 9.

Как уже обсуждалось в комментариях, самая сложная часть - это смещение +3:00. Встроенные средства форматирования Java и буквы шаблонов формата, которые вы можете использовать для указания собственного формата, требуют двухзначных часов в смещении. Используемый мной метод DateTimeFormatterBuilder.appendOffset позволяет указывать ограниченное количество форматов; 9 различных форматов в Java 8; 22 в Java 9.

0 голосов
/ 15 мая 2018

Комментарий от MadProgrammer действительно полезен. Спасибо чувак. Сначала я добавляю 0 перед 3 в часовом поясе, и моя строка стала '2018-05-15 09: 32: 51.550082 +03: 00', а затем я использую DateTimeFormatter 'гггг-ММ-дд ЧЧ: мм: сс.нз' и все работает сейчас. Спасибо всем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...