Validieren von Java 8 Termine
Ich würde gerne überprüfen verschiedene Datum-Formate, wie nachstehende Beispiele :
YYYY
YYYY-MM
YYYY-MM-DD
Validierung müssen gewährleisten, dass Datum format korrekt ist und das Datum vorhanden ist.
Ich bin mir bewusst, dass Java 8 bietet ein neues Date-API, so Frage ich mich, ob es in der Lage, das zu tun job.
Gibt es eine bessere Weise, die mit Java 8 date API ?
Ist es immer noch eine gute Praxis, um den Kalender Klasse mit Nachsicht parameter ?
- oracle.com/technetwork/articles/java/...
- Was erwarten Sie als ein Datum für "YYYY" ? "YYYY-01-01" ? Gleiche Frage für die "JJJJ-MM".
- Es hat nie eine gute Praxis zu verwenden
Calendar
Klasse.DateFormat
war immer in der Nutzung. - Sie sollten die neue
java.time
Dienstprogramme eingeführt, in JSR-310. Sie sollten vermeiden, die pre-Java-8-Datum-utilities wieCalendar
. - Wenn YYYY, überprüfen Sie, dass in diesem Jahr "existiert" (Ok... können wir überlegen, dass jeder JJJJ Jahr existiert...)
- Vielleicht eine Reihe von regex ist besser für dieses problem?
- Regex ist gut, wenn Sie testen möchten form, aber es wird wahrscheinlich fehlschlagen, wenn Sie wollen, um zu testen, detaillierte Inhalte wie
2222-33-44
oder2000-02-30
. - Ich könnte leicht verwenden Daten analysieren wenn, würde ich nur YYYY-MM-DD format. mit JJJJ und JJJJ-MM-format-Möglichkeiten, es ist einfacher mit regex
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie angeben, fehlende Felder mit
parseDefaulting
alle Formatierer arbeiten:Zur Validierung der
YYYY-MM-DD
- format, können Sie einfachLocalDate.parse
eingeführtjava.time
seit JDK 8.Einen
DateTimeParseException
wird geworfen, wenn das Datum ungültig ist.Für die beiden anderen Formate, die Sie uns gegeben hat, die Ausnahme geworfen werden. Das ist logisch, denn Sie sind nicht real, date, einfach Teil eines Datums.
LocalDate auch eine Methode
of(int year, int month, int dayOfMonth)
also, wenn Sie wirklich wollen, um zu überprüfen, einfach das Jahr, in manchen Fällen das Jahr mit dem Monat, in anderen Fall oder das vollständige Datum dann könnte man etwas wie das hier tun :Beachten Sie, dass Sie wissen mehrere Formate aber nicht Ihnen, also bin ich davon ausgegangen, das waren die einzigen 3.
Nutzung optionaler Felder und
parseBest
Sie nur überprüfen möchten, verstehe ich aber danach werden Sie wahrscheinlich wollen, um die Daten zu extrahieren, die in einer appopriate Weg. Glücklicherweise, und in der Tat, wie Sie schrieb, Java 8 stellt eine solche Methode
parseBest
.parseBest
in Kombination mit der optionalen Felder. So definieren Sie das format, das Sie möchten, zu analysieren zuerst:yyyy[-MM[-dd]]
mit den Klammern ([
und]
) die Verpackung des optionalen Felder.parseBest
auch erfordert, dass Sie mehrereTemporalQuery<R>
. Eigentlich ist es nur eine funktionale Hülle um eine template-Methode<R> R queryFrom(TemporalAccessor)
. Wir können also definierenTemporalQuery<R>
so einfach wieYear::from
. Gut: das ist genau das, was wir wollen. Die Sache ist, dassparseBest
ist nicht wirklich gut, heißt: es wird analysiert alle in Reihenfolge ab und Stoppt nach der ersten richtigenTemporalQuery
entspricht. Also in Ihrem Fall müssen wir uns von den meisten präzise weniger präzise. Hier sind die verschiedenen Typen, die Sie behandeln möchten:LocalDate
,YearMonth
undYear
. Also lasst uns einfach definierenTemporalQuery[]
alsLocalDate::from, YearMonth::from, Year::from
. Nun, wennparseBest
nicht erkennt Ihre Eingabe, wird eine Ausnahme geworfen.Alles in allem, wir werden konstruieren, die
parseBest
wie folgt:Also schreiben wir es richtig:
Aber... Sie wollen nur überprüfen... Gut in diesem Fall, ein Datum berechnet und die teure Arbeit ist bereits getan. Lassen Sie uns nur So definiert die Validierung wie folgt:
Ich weiß, es ist schlimm, Ausnahmen zu behandeln Fällen wie diesem, aber, während die aktuelle API ist sehr mächtig in diesem sehr speziellen Fall nicht berücksichtigt, so lassen Sie uns nur daran halten und verwenden Sie es wie es ist.
Hier ist der vollständige code:
Versuchen Sie es online!
Ausgabe:
Sie wollen mehr als nur die Validierung, wie immer der tatsächliche Wert?
Beachten Sie, dass Sie immer noch die Daten aus
parseBest
für weitere Verwendungen wie diese:Können Sie nachsichtig, ist Ihr Standardwert ist true:
in " = SimpleDAteFormat
oder im JSON-Validierung:
Bitte benutzen Sie den untenstehenden code. Dadurch wird überprüft, und funktioniert auch in jedem format.