2015-07-24 8 views
18

Meine Eingabe ist eine String-Darstellung eines Datums im Format "01-07-2015" für 1. Juli 2015. Ich versuche, dies in eine java.time.LocalDate Variable zu analysieren :String kann nicht zu LocalDate (Java 8)

final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd-MM-YYYY"); 
final String input = "01-07-2015"; 
final LocalDate localDate = LocalDate.parse(input, DATE_FORMAT); 

Basierend auf der DateTimeFormatter JavaDoc, würde ich erwarten, dass dies funktioniert. Allerdings bin ich mit einer sehr freundlichen und hilfs Nachricht empfangen:

Verursacht durch: java.time.DateTimeException: Kann nicht von LOCALDATE TemporalAccessor erhalten: {DayOfMonth = 1, MonthOfYear = 7, WeekBasedYear [WeekFields [Montag , 4]] = 2015}, ISO vom Typ java.time.format.Parsed

Ich verstehe nicht wirklich, was diese Ausnahme mir sagt. Kann mir jemand erklären, was schief läuft?

+9

Sie sollten wählen "yyyy" anstelle von "YYYY" – adatapost

Antwort

25

Für das Jahr müssen Sie das Klein y verwenden:

final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd-MM-yyyy"); 

Versalien- Y für weekyear verwendet wird. Weitere Informationen finden Sie unter javadoc of DateTimeFormatter.

+3

Nur aus Neugier, wie bezieht sich die Fehlermeldung auf die Tatsache, dass "Y" für _weekyear_ ist, während "y" für _year_ ist? – mthmulders

+4

Fehlermeldung sagt {DayOfMonth = 1, MonthOfYear = 7, WeekBasedYear [WocheFelds [MONTAG, 4]] = 2015}, es bedeutet 1 von Ihrer Eingabezeichenfolge als DayOfMonth (weil Sie "d" in Ihrem Muster verwendeten), 7 wurde als MonthOfYear (wegen "M" in Ihrem Muster) geparst und 2015 wurde als WeekBasedYear (alias weekyear) mit "Y" in Ihrem Muster verstanden – Kejml

+0

@mthmulders Manchmal [Ausnahme Nachrichten saugen] (http: //programmers.stackexchange .com/questions/278949/why-do-many-exception-nachrichten-nicht-enthalten-nützliche-details). Zugegeben, diese Ausnahme ist nicht wirklich so schlimm, und sie sagt Ihnen, was sie versucht hat, "YYYY" zu analysieren. Ich habe nachgeschlagen (https://www.google.com/search?q=java+datetimeformatter+weekbasedyear) und das erste Ergebnis führte mich [hier] (https://docs.oracle.com/javase /8/docs/api/java/time/format/DateTimeFormatter.html), in der die Bezeichner und ihre Bedeutung aufgeführt sind. –

12

Die Antwort auf die Frage ist, 'y' nicht 'Y' zu verwenden.

die Fehlermeldung zu erklären, lässt sie sich zersetzen:

Unable to obtain LocalDate from TemporalAccessor

Dies wird sagen, dass es kein LocalDate (was angefordert wurde) von einem TemporalAccessor (Low-Level-Schnittstelle erstellen können, die hashmap- bietet wie Zugriff auf die Felder Datum/Uhrzeit).

of type java.time.format.Parsed

Dieses sagt, dass das Objekt in die Methode übergeben vom Typ java.time.format.Parsed war. Dies ist der Standard-Ausgabetyp des Parsens und enthält alle Informationen, die analysiert wurden.

{DayOfMonth=1, MonthOfYear=7, WeekBasedYear[WeekFields[MONDAY,4]]=2015},ISO

Dies ist die toString() Form des java.time.format.Parsed Objekt, das von Parsen geführt. Es sagt, dass vier Dinge analysiert wurden:

  • DayOfMonth=1, analysiert die Tag-of-Monat mit einem Wert von 1
  • MonthOfYear=7, dem Monat des Wirtschaftsjahres mit dem Wert von 7 analysiert
  • WeekBasedYear[WeekFields[MONDAY,4]]=2015, die Woche basierte Jahre analysiert mit dem Wert von 2015
  • ISO, das dem Kalendersystem ISO ist (ein Standardwert)

Da aus der Kombination DayOfMonth + MonthOfYear + WeekBasedYear kein LocalDate erzeugt werden kann, wird eine Ausnahme ausgelöst.

Beachten Sie, dass der [WeekFields[MONDAY,4]] Teil bezieht sich auf die Tatsache, dass es viele verschiedene Möglichkeiten gibt, eine Woche zu definieren, in den USA Wochen beginnen am Sonntag, aber in der ISO-Norm und der EU beginnen sie am Montag.

Verwandte Themen