Überprüfen Sie, ob eine Zeichenfolge in Java ein gültiges Datum ist

1. Einleitung

In diesem Tutorial werden die verschiedenen Möglichkeiten erläutert, um zu überprüfen, ob eine Zeichenfolge in Java ein gültiges Datum enthält.

Wir werden die Lösungen vor Java 8, nach Java 8 und unter Verwendung des Apache Commons Validator diskutieren.

2. Übersicht über die Datumsüberprüfung

Wann immer wir Daten in einer Anwendung erhalten, müssen wir überprüfen, ob diese gültig sind, bevor wir eine weitere Verarbeitung durchführen.

Bei Datumseingaben müssen wir möglicherweise Folgendes überprüfen:

  • Die Eingabe enthält das Datum in einem gültigen Format, z. B. MM / TT / JJJJ
  • Die verschiedenen Teile der Eingabe liegen in einem gültigen Bereich
  • Die Eingabe wird in ein gültiges Datum im Kalender aufgelöst

Wir können reguläre Ausdrücke verwenden, um das Obige zu tun. Reguläre Ausdrücke für verschiedene Eingabeformate und Gebietsschemas sind jedoch komplex und fehleranfällig. Darüber hinaus können sie die Leistung beeinträchtigen.

Wir werden die verschiedenen Möglichkeiten diskutieren, um Datumsvalidierungen auf flexible, robuste und effiziente Weise zu implementieren.

Schreiben wir zunächst eine Schnittstelle für die Datumsüberprüfung:

public interface DateValidator { boolean isValid(String dateStr); }

In den nächsten Abschnitten werden wir diese Schnittstelle mithilfe der verschiedenen Ansätze implementieren.

3. Überprüfen Sie mit DateFormat

Java bietet von Anfang an Funktionen zum Formatieren und Analysieren von Daten. Diese Funktionalität befindet sich in der abstrakten DateFormat- Klasse und ihrer Implementierung - SimpleDateFormat .

Lassen Sie uns das Datum Validierung mit der Umsetzung Parse - Methode der Dateformat Klasse:

public class DateValidatorUsingDateFormat implements DateValidator { private String dateFormat; public DateValidatorUsingDateFormat(String dateFormat) { this.dateFormat = dateFormat; } @Override public boolean isValid(String dateStr) { DateFormat sdf = new SimpleDateFormat(this.dateFormat); sdf.setLenient(false); try { sdf.parse(dateStr); } catch (ParseException e) { return false; } return true; } }

Da das Dateformat und verwandte Klassen sind nicht Thread-sicher , schaffen wir eine neue Instanz für jeden Methodenaufruf.

Als nächstes schreiben wir den Unit-Test für diese Klasse:

DateValidator validator = new DateValidatorUsingDateFormat("MM/dd/yyyy"); assertTrue(validator.isValid("02/28/2019")); assertFalse(validator.isValid("02/30/2019"));

Dies war die häufigste Lösung vor Java 8.

4. Überprüfen Sie mit LocalDate

Java 8 führte eine verbesserte Datums- und Uhrzeit-API ein. Es wurde die LocalDate- Klasse hinzugefügt , die das Datum ohne Uhrzeit darstellt. Diese Klasse ist unveränderlich und threadsicher.

LocalDate bietet zwei statische Methoden zum Analysieren von Daten. Beide verwenden einen DateTimeFormatter , um die eigentliche Analyse durchzuführen :

public static LocalDate parse​(CharSequence text) // parses dates using using DateTimeFormatter.ISO_LOCAL_DATE public static LocalDate parse​(CharSequence text, DateTimeFormatter formatter) // parses dates using the provided formatter

Verwenden wir die Analysemethode , um die Datumsüberprüfung zu implementieren:

public class DateValidatorUsingLocalDate implements DateValidator { private DateTimeFormatter dateFormatter; public DateValidatorUsingLocalDate(DateTimeFormatter dateFormatter) { this.dateFormatter = dateFormatter; } @Override public boolean isValid(String dateStr) { try { LocalDate.parse(dateStr, this.dateFormatter); } catch (DateTimeParseException e) { return false; } return true; } }

Die Implementierung verwendet ein DateTimeFormatter- Objekt zur Formatierung. Da diese Klasse threadsicher ist, verwenden wir dieselbe Instanz für verschiedene Methodenaufrufe.

Fügen wir für diese Implementierung auch einen Komponententest hinzu:

DateTimeFormatter dateFormatter = DateTimeFormatter.BASIC_ISO_DATE; DateValidator validator = new DateValidatorUsingLocalDate(dateFormatter); assertTrue(validator.isValid("20190228")); assertFalse(validator.isValid("20190230"));

5. Überprüfen Sie mit DateTimeFormatter

Im vorherigen Abschnitt haben wir gesehen, dass LocalDate ein DateTimeFormatter- Objekt zum Parsen verwendet. Wir können die DateTimeFormatter- Klasse auch direkt zum Formatieren und Parsen verwenden.

DateTimeFormatter analysiert einen Text in zwei Phasen. In Phase 1 wird der Text je nach Konfiguration in verschiedene Datums- und Zeitfelder analysiert. In Phase 2 werden die analysierten Felder in ein Datums- und / oder Zeitobjekt aufgelöst.

Das ResolverStyle- Attribut steuert Phase 2. Es ist eine Aufzählung mit drei möglichen Werten:

  • LENIENT - Löst Daten und Zeiten nachsichtig auf
  • SMART - Löst Daten und Zeiten auf intelligente Weise auf
  • STRICT - Löst Daten und Zeiten streng auf

Schreiben wir nun die Datumsüberprüfung direkt mit DateTimeFormatter :

public class DateValidatorUsingDateTimeFormatter implements DateValidator { private DateTimeFormatter dateFormatter; public DateValidatorUsingDateTimeFormatter(DateTimeFormatter dateFormatter) { this.dateFormatter = dateFormatter; } @Override public boolean isValid(String dateStr) { try { this.dateFormatter.parse(dateStr); } catch (DateTimeParseException e) { return false; } return true; } }

Als nächstes fügen wir den Komponententest für diese Klasse hinzu:

DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd", Locale.US) .withResolverStyle(ResolverStyle.STRICT); DateValidator validator = new DateValidatorUsingDateTimeFormatter(dateFormatter); assertTrue(validator.isValid("2019-02-28")); assertFalse(validator.isValid("2019-02-30"));

Im obigen Test erstellen wir einen DateTimeFormatter basierend auf Muster und Gebietsschema. Wir verwenden die strikte Auflösung für Daten.

6. Validieren Sie mit Apache Commons Validator

Das Apache Commons-Projekt bietet ein Validierungsframework. Dies enthält Validierungsroutinen wie Datum, Uhrzeit, Zahlen, Währung, IP-Adresse, E-Mail und URL.

Für unser Ziel in diesem Artikel werfen wir einen Blick auf die nehmen GenericValidator - Klasse, die ein paar Methoden liefert zu prüfen , ob ein String ein gültiges Datum enthält:

public static boolean isDate(String value, Locale locale) public static boolean isDate(String value,String datePattern, boolean strict)

Um die Bibliothek zu verwenden, fügen wir unserem Projekt die Commons-Validator- Maven-Abhängigkeit hinzu:

 commons-validator commons-validator 1.6 

Verwenden Sie als Nächstes die GenericValidator- Klasse, um Datumsangaben zu überprüfen :

assertTrue(GenericValidator.isDate("2019-02-28", "yyyy-MM-dd", true)); assertFalse(GenericValidator.isDate("2019-02-29", "yyyy-MM-dd", true));

7. Fazit

In diesem Artikel haben wir uns die verschiedenen Möglichkeiten angesehen, um zu überprüfen, ob eine Zeichenfolge ein gültiges Datum enthält.

Wie immer finden Sie den vollständigen Quellcode auf GitHub.