2015-04-07 8 views
8

Ich bin mit diesem DateTimeFormatter:Parsing String lokales Datum nicht Jahrhundert gewünschte Verwendung

DateTimeFormatter.ofPattern("ddMMYY") 

ich die Zeichenfolge 150790 analysieren will, und ich habe diesen Fehler:

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

Offensichtlich I wollen die folgende TemporalAccessor erhalten:

{DayOfMonth=15, MonthOfYear=7, WeekBasedYear=1990} 

wissen Sie, warum ich das Jahr bekam 209 0 statt 1990?

Danke für Ihre Hilfe

Antwort

12

Da diese Frage wirklich über java.time -package neu und SimpleDateFormat NICHT ich relevant section folgende zitieren wird:

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.

Wir sehen, dass Java-8 den Bereich verwendet 2000- 2099 pro Standard, nicht wie SimpleDateFormat der Bereich -80 Jahre bis +20 Jahre im Vergleich zu heute.

Wenn Sie es konfigurieren möchten, müssen Sie appendValueReduced() verwenden. Dies ist in einer ungünstigen Art und Weise gestaltet, aber möglich, siehe hier:

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 

By the way, wenn Sie wirklich Woche basierte Jahre wollen, dann müssen Sie Y anstelle von y oder den entsprechenden Feld IsoFields.WEEK_BASED_YEAR. In Anbetracht der Tatsache, dass Sie keine anderen wochenbezogenen Felder haben, würde ich das normale Kalenderjahr, nicht das wochenbasierte Kalenderjahr, annehmen.