tl; dr
Verwenden Sie den strengen Modus, um a java.time.DateTimeFormatter
zu analysieren LocalDate
. Falle für die DateTimeParseException
.
LocalDate.parse( // Represent a date-only value, without time-of-day and without time zone.
"31/02/2000" , // Input string.
DateTimeFormatter // Define a formatting pattern to match your input string.
.ofPattern ( "dd/MM/uuuu" )
.withResolverStyle ( ResolverStyle.STRICT ) // Specify leniency in tolerating questionable inputs.
)
Nach dem Parsen können Sie nach einem angemessenen Wert suchen. Zum Beispiel ein Geburtsdatum innerhalb der letzten hundert Jahre.
birthDate.isAfter( LocalDate.now().minusYears( 100 ) )
Vermeiden Sie ältere Datums- und Zeitklassen
Vermeiden Sie die Verwendung der problematischen alten Datums- / Uhrzeitklassen, die mit den frühesten Java-Versionen geliefert werden. Jetzt ersetzt durch die java.time- Klassen.
LocalDate
& DateTimeFormatter
&ResolverStyle
Die LocalDate
Klasse repräsentiert einen Nur-Datum-Wert ohne Tageszeit und ohne Zeitzone.
String input = "31/02/2000";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "dd/MM/uuuu" );
try {
LocalDate ld = LocalDate.parse ( input , f );
System.out.println ( "ld: " + ld );
} catch ( DateTimeParseException e ) {
System.out.println ( "ERROR: " + e );
}
Die java.time.DateTimeFormatter
Klasse kann so eingestellt werden, dass Zeichenfolgen mit einem der drei in der ResolverStyle
Aufzählung definierten Kronzeugenmodi analysiert werden . Wir fügen eine Zeile in den obigen Code ein, um jeden der Modi auszuprobieren.
f = f.withResolverStyle ( ResolverStyle.LENIENT );
Die Ergebnisse:
ResolverStyle.LENIENT
ld: 2000-03-02
ResolverStyle.SMART
ld: 2000-02-29
ResolverStyle.STRICT
FEHLER: java.time.format.DateTimeParseException: Text '31 / 02/2000 'konnte nicht analysiert werden: Ungültiges Datum' 31. FEBRUAR '
Wir können sehen, dass im ResolverStyle.LENIENT
Modus das ungültige Datum um eine entsprechende Anzahl von Tagen verschoben wird. Im ResolverStyle.SMART
Modus (Standardeinstellung) wird eine logische Entscheidung getroffen, das Datum innerhalb des Monats zu halten und mit dem letztmöglichen Tag des Monats, dem 29. Februar, in einem Schaltjahr fortzufahren, da es in diesem Monat keinen 31. Tag gibt. Der ResolverStyle.STRICT
Modus löst eine Ausnahme aus, die sich darüber beschwert, dass es kein solches Datum gibt.
Alle drei sind je nach Geschäftsproblem und Richtlinien angemessen. Klingt so, als ob Sie in Ihrem Fall möchten, dass der strikte Modus das ungültige Datum ablehnt, anstatt es anzupassen.
Über java.time
Der java.time Rahmen in Java 8 gebaut und später. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie java.util.Date
, Calendar
, & SimpleDateFormat
.
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Strings, keine Notwendigkeit für java.sql.*
Klassen.
Woher bekomme ich die java.time-Klassen?
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden Interval
, YearWeek
, YearQuarter
, und mehr .