2015-02-04 1 views
9

Если месяц находится в верхнем или нижнем регистре, то есть нет случая с заголовком, DateTimeFormatter не может проанализировать дату. Есть ли простой способ конвертировать дату в заголовок или способ сделать форматтер более мягким?Как обрабатывать верхний или нижний регистр в JSR 310?

for (String date : "15-JAN-12, 15-Jan-12, 15-jan-12, 15-01-12".split(", ")) { 
    try { 
     System.out.println(date + " => " + LocalDate.parse(date, 
            DateTimeFormatter.ofPattern("yy-MMM-dd"))); 
    } catch (Exception e) { 
     System.out.println(date + " => " + e); 
    } 
} 

печатает

15-JAN-12 => java.time.format.DateTimeParseException: Text '15-JAN-12' could not be parsed at index 3 
15-Jan-12 => 2015-01-12 
15-01-12 => java.time.format.DateTimeParseException: Text '15-01-12' could not be parsed at index 3 
15-jan-12 => java.time.format.DateTimeParseException: Text '15-jan-12' could not be parsed at index 3 

ответ

19

DateTimeFormatter ы строги и чувствительны к регистру по умолчанию. Используйте DateTimeFormatterBuilder и укажите parseCaseInsensitive() для анализа без учета регистра.

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
    .parseCaseInsensitive() 
    .appendPattern("yy-MMM-dd") 
    .toFormatter(Locale.US); 

Чтобы иметь возможность анализировать числовые месяцев (то есть. "15-01-12"), необходимо также указать parseLenient().

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
    .parseCaseInsensitive() 
    .parseLenient() 
    .appendPattern("yy-MMM-dd") 
    .toFormatter(Locale.US); 

Вы также можете быть более многословным указать только месяц часть в случае нечувствительны/мягкому:

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
    .appendPattern("yy-") 
    .parseCaseInsensitive() 
    .parseLenient() 
    .appendPattern("MMM") 
    .parseStrict() 
    .parseCaseSensitive() 
    .appendPattern("-dd") 
    .toFormatter(Locale.US); 

В теории, это может быть быстрее, но я не уверен, если она есть.

PS: Если вы укажете parseLenient() до начала года, он также проанализирует 4-значные годы (то есть "2015-JAN-12") правильно.

+2

@hraldK Если '.parseLenient()' не установлен, формат «15-01-12» завершится с ошибкой. – SubOptimal