Разобрать все форматы ISO 8601 DateTime Java 1.8 - PullRequest
0 голосов
/ 05 ноября 2018

я использую весеннюю загрузку и Java 1.8 в моем проекте. Мы получаем строку даты из внешней системы, которую нам нужно проанализировать. Проблема заключается в том, что внешняя система может отправлять любой DateTime, соответствующий стандарту ISO 8601, и нам необходимо проанализировать любую строку формата ISO 8601, которая приходит. Кто-нибудь может подсказать мне, как это сделать? есть ли библиотека для этого?

Передано два формата DateTime: 2018-11-01T16: 26: 15 + 0100, 2018-10-31T08: 27: 00.0000000Z, и их может быть намного больше.

Я нашел несколько сообщений в StackOverflow, в которых предлагается использовать конвертер Joda Time, но я не могу проанализировать дату 2018-10-31T08: 27: 00.0000000Z с этим.

1 Ответ

0 голосов
/ 07 ноября 2018

Это может решить это за вас или, по крайней мере, начать:

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .append(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
            .appendPattern("XX")
            .toFormatter();

    String[] stringsPassed = {
            "2018-11-01T16:26:15+0100",
            "2018-10-31T08:27:00.0000000Z"
    };

    for (String sample : stringsPassed) {
        OffsetDateTime odt = OffsetDateTime.parse(sample, formatter);
        System.out.println(odt);
    }

Выход:

2018-11-01T16:26:15+01:00
2018-10-31T08:27Z

Он не анализирует все мыслимые строки ISO 8601, но может анализировать те, которые вы можете получить. Поскольку вы не показали нам только два образца, я не могу знать.

java.time, современный Java-интерфейс даты и времени, вполне соответствует стандарту ISO 8601. Он обрабатывает наличие и отсутствие секунд и доли секунды (до 9 знаков после запятой). Это то, что я использую DateTimeFormatter.ISO_LOCAL_DATE_TIME в коде. Небольшая проблема заключается в том, что встроенному DateTimeFormatter.ISO_OFFSET_DATE_TIME, который в противном случае может показаться правильным, требуется двоеточие в смещении UTC, как в +01:00. Вместо этого я использую шаблон формата XX. Он принимает смещение без двоеточия, а также принимает Z, как во втором примере. Если требуется еще больше гибкости, вы можете посмотреть дополнительные части в форматере. Проверьте документацию.

Joda-Time? Не рекомендуется при использовании Java 8. Несколько цитат с домашней страницы Joda-Time:

Joda-Time - это фактическая стандартная библиотека даты и времени для Java до Java SE 8. Теперь пользователям предлагается перейти на java.time (JSR-310).

Обратите внимание, что Joda-Time считается в значительной степени "законченным" проектом. Никаких серьезных улучшений не планируется. Если вы используете Java SE 8, пожалуйста, перенесите до java.time (JSR-310).

Даже на Java 6 и 7 я бы порекомендовал бэкпорт java.time вместо Joda-Time.

Ссылки

...