DateTimeFormatter для анализа всех допустимых ISO стилей смещения зоны

С помощью следующего средства форматирования я могу анализировать "2017-03-28T23:40:06.000+0100"

new DateTimeFormatterBuilder()
            .append(ISO_LOCAL_DATE_TIME)
            .appendPattern("X")
            .toFormatter();

С другим он разбирает "2017-03-28T23:40:06.000+01:00"

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

Однако я не могу указать средство форматирования, которое анализирует оба. Какой узор мне добавить?

Formatter также должен иметь возможность обрабатывать временные метки без смещения зоны, например "2017-03-28T23:40:06.000Z"


person Michal Kordas    schedule 23.04.2019    source источник


Ответы (3)


Поскольку DateTimeFormatterBuilder ведет себя как свободный интерфейс, проще всего добавить оба шаблона:

new DateTimeFormatterBuilder()
        .append(ISO_LOCAL_DATE_TIME)
        .appendPattern("X")
        .appendPattern("XX")
        .toFormatter();
person Nikolas Charalambidis    schedule 23.04.2019
comment
При этом я не могу проанализировать другой формат: `java.time.format.DateTimeParseException: Text '2017-03-28T23: 40: 06.000Z' не может быть проанализирован, неанализируемый текст найден в индексе 23 - person Michal Kordas; 23.04.2019
comment
Удивительно, но, похоже, Джода не может так работать: / - person Nikolas Charalambidis; 23.04.2019

Следующее начало работать для меня

new DateTimeFormatterBuilder()
            .append(ISO_LOCAL_DATE_TIME)
            .optionalStart()
            .appendPattern("[XXX][X]")
            .toFormatter();
person Michal Kordas    schedule 23.04.2019

Однажды у меня была задача разобрать любую String на Date, если String представляет действительную дату, заранее не зная формата. В основном мне нужно было отформатировать String любого возможного формата. Мне пришла в голову идея, когда вы записываете в файл все форматы данных, которые хотите поддерживать, а затем читаете форматы один за другим и пытаетесь анализировать String по этому формату, пока у вас не получится или не закончатся форматы. Вот ссылка на статью, в которой более подробно описана идея: Пакет Java 8 java.time: анализ любой строки на текущий момент

person Michael Gantman    schedule 23.04.2019
comment
Я заранее знаю формат, он должен быть в формате ISO - person Michal Kordas; 23.04.2019
comment
Да, я понимаю, что вы заранее знаете некоторые ограничения ваших форматов, но вы не можете создать единый формат, охватывающий все возможные варианты. Поэтому вы можете применить ту же идею, что и я. Имейте несколько форматов, которые вместе охватывают все допустимые параметры, и попробуйте проанализировать вашу строку с этими форматами один за другим. - person Michael Gantman; 23.04.2019
comment
Это именно то, что я сделал, спасибо. Смотрите мой ответ. - person Michal Kordas; 23.04.2019