Java: Nicht in der Lage zu erhalten, LocalDate von TemporalAccessor
Ich versuche, ändern Sie das format einer String
Datum von EEEE MMMM d
zu MM/d/yyyy
wird zuerst die Umwandlung in einen LocalDate
und dann die Anwendung auf einen Formatierer, der ein anderes Muster der LocalDate
vor der Analyse in String
wieder.
Hier ist mein code:
private String convertDate(String stringDate)
{
//from EEEE MMMM d -> MM/dd/yyyy
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.append(DateTimeFormatter.ofPattern("EEEE MMMM d"))
.toFormatter();
LocalDate parsedDate = LocalDate.parse(stringDate, formatter);
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("MM/d/yyyy");
String formattedStringDate = parsedDate.format(formatter2);
return formattedStringDate;
}
Allerdings bekomme ich diese exception-Nachricht, die ich nicht wirklich verstehe:
Exception in thread "main" java.time.format.DateTimeParseException: Text 'TUESDAY JULY 25' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {DayOfWeek=2, MonthOfYear=7, DayOfMonth=25},ISO of type java.time.format.Parsed
at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
- Gut, man kann nicht ein Datum ohne Jahr.
- Sie haben nicht gesagt, was Sie erwarten, dass das Jahr zu werden. Das aktuelle Jahr? Immer 2017? Aus der Arbeit des Jahres basierend auf der Kombination von Tag-des-Monats-und Tag-der-Woche? Entweder KayV oder Hugo am nächsten ist vom Anwendungsfall abhängig.
- Nahezu doppelte von Java Autocomplete/Format Datum von MM-DD-Eingang
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Dokumentation für
LocalDate
sagt, dassIn Ihrem Fall, wird die Eingabe
String
ist, fehlt eine wichtige Komponente derLocalDate
ich.e Jahr. Was du hast ist im Grunde, Monat und Tag. So können Sie eine Klasse geeignet, dieMonthDay
. Mit, dass Ihr code geändert werden kann :Wie die anderen Antworten schon gesagt, zum erstellen einer
LocalDate
müssen Sie die Jahr, die nicht in der EingabeString
. Es hat nur Tag, Monat und Tag der Woche.Erhalten die komplette
LocalDate
, die Sie benötigen, um eine Analyse der Tag und Monat und finden Sie einen Jahr, in denen diese Tag/Monat Kombination entspricht der Tag der Woche.Natürlich könnten Sie ignorieren die Tag der Woche und davon ausgehen, dass das Datum immer in der aktuellen Jahr; in diesem Fall, die anderen Antworten schon die Lösung. Aber wenn Sie wollen finden die Jahr, die exakt auf die Tag der Woche, müssen Sie eine Schleife, bis Sie es finden.
Ich bin auch die Schaffung eines formatter mit einem
java.util.Locale
machen deutlich, dass möchte ich Monat und Tag der Woche Namen in Englisch. Wenn Sie nicht ein Gebietsschema anzugeben, verwendet das system die Standard -, und es ist nicht gewährleistet, dass Sie immer Englisch sein (und es können ohne Vorherige Ankündigung geändert werden, auch zur Laufzeit).In diesem Beispiel, begann ich im Jahr 2017 und versucht, ein Datum zu finden, bis zurück zu 1970, aber Sie können anpassen, um die Werte, die passend für Ihre Anwendungsfälle.
Erhalten Sie auch das aktuelle Jahr (statt einem festen, beliebigen Wert) mit
Year.now().getValue()
.Hier ist die geringfügige änderung, die Sie brauchen, um zu implementieren:
Fügen Sie die Standard-chronologischer Jahr in den Formatierer mit
.parseDefaulting(ChronoField.YEAR, 2017)
Rufen Sie die Methode mit dem argument
"Tuesday July 25"
wie dieseconvertDate("Tuesday July 25");
Weitere option ist das folgende zu tun (genau wie die anderen Antworten ein wenig hacky), vorausgesetzt natürlich, Sie wollen das Datum fällt in das laufende Jahr: