2015-02-04 11 views
9

Jeśli miesiąc ma wartość GŁĘBOKĄ lub małą, tzn. Nie zawiera tytułu, funkcja DateTimeFormatter nie może przeanalizować daty. Czy istnieje prosty sposób przekonwertowania daty na tytuł lub sposób, w jaki formater jest łagodniejszy?Jak obsługiwać duże lub małe litery w 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); 
    } 
} 

drukuje

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 

Odpowiedz

19

DateTimeFormatter y są surowe i wielkość liter domyślnie. Użyj wartości DateTimeFormatterBuilder i określ parseCaseInsensitive(), aby analizować wielkość liter bez względu na wielkość liter.

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

Aby móc analizować miesięcy liczbowe (np. "15-01-12"), trzeba także określić parseLenient().

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

Możesz być także bardziej gadatliwy określić tylko jako część miesiąca przypadku nieczuły/łagodniejszej:

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

Teoretycznie może to być szybciej, ale nie jestem pewien, czy to jest.

PS: Jeśli określisz parseLenient() przed częścią roku, będzie również poprawnie analizować 4-cyfrowe lata (tj. "2015-JAN-12").

+2

@hraldK Jeśli '.parseLenient()' nie zostanie ustawione, format "15-01-12" zakończy się niepowodzeniem. – SubOptimal