2015-02-04 8 views
9

Bir ay UPPER veya küçük harf, yani Başlık durumu değil ise, DateTimeFormatter tarihi ayrıştıramaz. Bir tarihi başlık dosyasına dönüştürmek için basit bir yol var mı, yoksa biçimlendiriciyi daha hafif hale getirmenin bir yolu var mı?JSR 310'da büyük veya küçük harf nasıl kullanılır?

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); 
    } 
} 

baskılar

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 

cevap

19

DateTimeFormatter ler sıkı ve varsayılan olarak küçük harfe duyarlıdır. Büyük/küçük harf duyarlı olmayanları ayrıştırmak için DateTimeFormatterBuilder kullanın ve parseCaseInsensitive() belirtin.

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

sayısal ay (yani. "15-01-12"), ayrıca parseLenient() belirtmeniz gerekir ayrıştırmak edebilmek.

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

Teoride, bu daha hızlı olabilir, ama olup olmadığından emin değilim:

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

Ayrıca duyarsız/hoşgörülü vaka olarak sadece ay kısmını belirlemek için daha ayrıntılı olabilir.

Not: Yıl parçasından önce parseLenient() belirtirseniz, 4 basamaklı yılları da (örn. "2015-JAN-12") doğru şekilde ayrıştırır.

+2

@hraldK Eğer '.parseLenient()' ayarlı değilse, "15-01-12" biçimi başarısız olur. – SubOptimal

İlgili konular