2015-04-07 13 views
8

Używam tego DateTimeFormatter:analizowaniem ciąg lokalnej daty nie korzysta pożądany wiek

DateTimeFormatter.ofPattern("ddMMYY") 

Chcę przeanalizować ciągu 150790 i mam ten błąd:

Unable to obtain LocalDate from TemporalAccessor: {DayOfMonth=15, MonthOfYear=7, WeekBasedYear[WeekFields[MONDAY,4]]=2090},ISO of type java.time.format.Parsed 

Oczywiście, ja chcesz uzyskać następujące TemporalAccessor: :

{DayOfMonth=15, MonthOfYear=7, WeekBasedYear=1990} 
Czy wiesz, dlaczego dostałem rok 209 0 zamiast 1990?

Dzięki za pomoc

Odpowiedz

12

Ponieważ kwestia ta jest tak naprawdę o nowej java.time -package i nie SimpleDateFormat przytoczę następujące relevant section:

Year: The count of letters determines the minimum field width below which padding is used. If the count of letters is two, then a reduced two digit form is used. For printing, this outputs the rightmost two digits. For parsing, this will parse using the base value of 2000, resulting in a year within the range 2000 to 2099 inclusive.

Widzimy, że Java-8 wykorzystuje szereg 2000- 2099 za domyślnie, nie jak SimpleDateFormat zakres -80 lat do +20 lat w stosunku do dzisiaj.

Jeśli chcesz go skonfigurować, musisz użyć appendValueReduced(). Jest to zaprojektowany w sposób niewygodny, ale możliwe, zobacz tutaj:

String s = "150790"; 

// old code with base range 2000-2099 
DateTimeFormatter dtf1 = 
    new DateTimeFormatterBuilder().appendPattern("ddMMyy").toFormatter(); 
System.out.println(dtf1.parse(s)); // 2090-07-15 

// improved code with base range 1935-2034 
DateTimeFormatter dtf2 = 
    new DateTimeFormatterBuilder().appendPattern("ddMM") 
    .appendValueReduced(
    ChronoField.YEAR, 2, 2, Year.now().getValue() - 80 
).toFormatter(); 
System.out.println(dtf2.parse(s)); // 1990-07-15 

Nawiasem mówiąc, jeśli naprawdę chcesz tygodniu oparte lat potem trzeba użyć Y zamiast y lub odpowiednim polu IsoFields.WEEK_BASED_YEAR. Biorąc pod uwagę, że nie masz żadnych innych pól związanych z tygodniem, założyłbym normalny rok kalendarzowy, a nie tygodniowy.