Как разбирать строки без учета регистра с помощью jsr310 DateTimeFormatter?

jsr-310 имеет удобный класс DateTimeFormatters, который позволяет вам построить DateTimeFormatter. Мне особенно нравится метод pattern(String) - см. javadoc

Однако я попал в проблему, в которой это чувствительно к регистру - например,

DateTimeFormatters.pattern("dd-MMM-yyyy");

совпадает с "01-янв-2012", но не с "01-JAN-2012" или "01-jan-2012".

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

Но похоже, что должен быть более простой способ...

Ответ 1

И есть... согласно Руководство пользователя (в автономном режиме, см. JavaDoc), вы должны использовать DateTimeFormatterBuilder для создания сложного DateTimeFormatter

например.

DateTimeFormatterBuilder builder = new DateTimeFormatterBuilder();
builder.parseCaseInsensitive();
builder.appendPattern("dd-MMM-yyyy");
DateTimeFormatter dateFormat = builder.toFormatter();

Ответ 2

Эта альтернатива полезна для инициализации статических переменных:

DateTimeFormatter myFormatter = new DateTimeFormatterBuilder()
                               .parseCaseInsensitive()
                               .appendPattern("dd-MMM-yyyy")
                               .toFormatter(Locale.ENGLISH);

Ответ 3

Просто дополнительная заметка, порядок имеет значение.

Это без учета регистра:

            DateTimeFormatter format = new DateTimeFormatterBuilder()
                .parseCaseInsensitive()
                .parseLenient()
                .appendPattern("HH:mm EEEE")
                .toFormatter(); 

Это не так:

            DateTimeFormatter format = new DateTimeFormatterBuilder()
                .appendPattern("HH:mm EEEE")
                .parseCaseInsensitive()
                .parseLenient()
                .toFormatter();