Wie um zu überprüfen, ob Zeichenfolge Datum, Muster, Zeit mit API?
Mein Programm ist das Parsen einer Eingabezeichenfolge auf eine LocalDate
Objekt. Für die meisten der Zeit, die die Zeichenfolge sieht aus wie 30.03.2014
, aber gelegentlich sieht es aus wie 3/30/2014
. Je nach dem, ich muss eine andere Muster zu nennen DateTimeFormatter.ofPattern(String pattern)
mit. Grundsätzlich, ich brauche, um zu überprüfen, ob der string dem Muster entspricht dd.MM.yyyy
oder M/dd/yyyy
vor der Analyse.
Der regex-Ansatz wäre so etwas wie:
LocalDate date;
if (dateString.matches("^\\d?\\d/\\d{2}/\\d{4}$")) {
date = LocalDate.parse(dateString, DateTimeFormatter.ofPattern("M/dd/yyyy"));
} else {
date = LocalDate.parse(dateString, DateTimeFormatter.ofPattern("dd.MM.yyyy"));
}
Dies funktioniert, aber es wäre schön, um das Datum Muster-Zeichenfolge, wenn passende string auch.
Gibt es irgendwelche standard-Möglichkeiten, dies zu tun mit die neue Java 8 Zeit-API, ohne auf regex-matching? Ich habe mir in den docs für DateTimeFormatter
aber ich konnte nichts finden.
- Warum nicht ein string
replace("//", ".")
? - Ich glaube nicht, dass es eine bestimmte Methode, um zu überprüfen, ob ein Datum folgt einem bestimmten Muster. Ich würde das " = SimpleDateFormat.Analyse-Methode, und überprüfen Sie für eine ParseException. Wenn Sie sicher sind, dass das Datum korrekt ist, und es ist in einem der beiden Muster, können Sie einfach überprüfen, ob es ist". " im string.
- Weil Monat und Tag sind nicht in der gleichen Stelle in beiden mustern.
- Ich bin nicht dieses posting als eine Antwort, denn ich weiß nicht, ob es eine praktikable option für Sie, eine Klasse zu erstellen, die für dieser. Ist es? Wie dieses: tryjava8.com/app/snippets/5368a343e4b0753f2af0f806
- Die Klasse
SimpleDateFormat
können nicht direkt analysiert, um einenLocalDate
nur zujava.util.Date
das ist ganz anders. - Das ist eine mögliche Lösung, wenn keine andere Lösung existiert bereits. Bitte poste es als Antwort sowieso. BTW, die Website, die Sie verlinkt konnte, wenn ich ran die Beispiel.
- Schauen Sie auf meine aktualisierte Antwort, es ist vielleicht einfacher als das erstellen einer Klasse für das.
- Danke, das ist eine schöne Lösung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Okay ich werde gehen Sie vor und buchen Sie als Antwort. Eine Möglichkeit ist das erstellen der Klasse, der hält die Muster.
Könnte man verbessern, da @MenoHochschild hat direkt durch erstellen eines Arrays von
DateTimeFormatter
aus dem array derString
übergeben Sie im Konstruktor.Andere Weg wäre, um eine
DateTimeFormatterBuilder
, gefolgt von den Formaten, die Sie wollen. Kann es einige andere Möglichkeiten, es zu tun, ich wollte nicht gehen Sie tief durch in der Dokumentation 🙂Den Ansatz von @ZouZou, ist eine mögliche Lösung.
Um zu vermeiden, mit Ausnahmen für die Programm-Logik so viel wie möglich (auch nicht so schön performancewise) folgende alternative angesehen werden könnten:
Mehr Aufschluss über die Methode
parseUnresolved()
:Dieser Methode wird nur die erste phase der Analyse, so gibt es keine zweite phase mit vorläufiger Validierung oder die Kombination von Bemühungen der analysierten Felder. Allerdings
LocalDate.from()
nicht überprüfen jede Eingabe, also ich denke, das ist noch ausreichend. Und der Vorteil ist, dassparseUnresolved()
mit dem Fehler-index vonParsePosition
. Dies steht im Einklang mit der traditionellenjava.text.Format
-Verhalten.Leider ist die alternative und mehr intuitive Methode, DateTimeFormater.parse() erstellt zunächst ein
DateTimeParseException
und speichern Sie dann die Fehler index in diese Ausnahme. So entschied ich mich nicht um diese Methode zu verwenden, um zu vermeiden, die Schaffung eine unnötige Ausnahme. Für mich, diese API-detail ist eine fragwürdige design-Entscheidung.