Überprüfen Sie das aktuelle Datum und die Uhrzeit beim Analysieren mit Javas SimpleDateFormat

Nicht vorhandene Daten werden analysiert

Probe mit minimaler Codierung.

normal


String target = "2019/07/20 12:34:56";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
try{
    Date result = sdf.parse(target);
    System.out.println(sdf.format(result));
}catch(ParseException e){
    e.printStackTrace();
}
2019/07/20 12:34:56

Analyse und Format werden gemäß dem eingegebenen "String" -Wert ausgeführt.

Hier werden wir das Verhalten überprüfen, wenn der Wert von "String" auf "2020/27/72 72: 72: 72" gesetzt ist. In einem Prozess, der im Allgemeinen wie dieser Wert das Datum und die Uhrzeit analysiert, die nicht existieren, Datums- und Uhrzeitdaten, die nicht im Kalender oder auf der Uhr angezeigt werden können Sie möchten, dass die Analyse als abnormale Eingabe fehlschlägt. Dieser Artikel wurde für diese Anforderung geschrieben.

abnormal


String target = "2020/27/72 72:72:72";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
try {
    Date result = sdf.parse(target);
    System.out.println(sdf.format(result));
} catch (ParseException e) {
    e.printStackTrace();
}
2022/05/14 01:13:12

In Bezug auf das Verhalten erfolgt die Konvertierung einfach so, ohne eine "ParseException" auszulösen.

Ich möchte solche Daten nicht analysieren

Mit nur einem Schritt können Sie überprüfen, ob Datum und Uhrzeit tatsächlich vorhanden sind.

1 Schritt hinzugefügt


String target = "2020/27/72 72:72:72";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
/* setLinient(boolean)Anruf hinzufügen zu*/
sdf.setLenient(false);
try {
    Date result = sdf.parse(target);
    System.out.println(sdf.format(result));
} catch (ParseException e) {
    e.printStackTrace();
}
java.text.ParseException: Unparseable date: "2020/27/72 72:72:72"
	at java.text.DateFormat.parse(DateFormat.java:366)
	at ...

Es wird also eine "ParseException" ausgelöst Wie bei anderen Fällen ungültiger Eingabewerte (in diesem Implementierungsbeispiel "20. Juli, 1. Jahr von Reiwa"), Sie können damit umgehen, indem Sie Ausnahmen abholen. Wie damit umzugehen ist, hängt von den Implementierungsanforderungen ab, daher werde ich nicht darauf eingehen.

Wenn Sie wissen möchten, wie man mit Codierung umgeht, ist dies das Ende. Danach habe ich versucht, den Hintergrund der aufgerufenen Methode zu untersuchen.


2020/27/72 72:72:72 = 2022/05/14 01:13:12? Eine leichte Erklärung, warum die im obigen Codebeispiel angegebenen Daten zu diesem Zeitpunkt vorliegen. Überprüfen Sie nur den Zeitteil von Datum und Uhrzeit. 72:00 = 24 Stunden x 3 72 Minuten = 60 Minuten x 1 + 12 Minuten 72 Sekunden = 60 Sekunden x 1 + 12 Sekunden → (12 Sekunden + 1 Minute) + (12 Minuten + 1 Stunde) + 3 Tage → 12 Sekunden + 13 Minuten + 1 Stunde In ähnlicher Weise ist der Wert von drei Tagen im Datumsteil enthalten, und der Betrag, der von jedem Monat überläuft, ist enthalten.

Bestätigung der Beschreibung in Java-Spezifikationen

Überprüfen Sie die Beschreibung in Java8-API (SimpleDateFormat).

Überprüfen Sie die Spezifikationen für die Anzahl der Stellen im Eingabewert

Da "JJJJ / MM / TT HH: MM: SS" als Format angegeben ist, MM ist 2-stellig, dd ist auch 2-stellig ... Sonst ist es NG? Es ist wie eine Illusion, also überprüfe es.

input


SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
sdf.setLenient(false);
String zeropad = "2019/01/02 03:04:05";  //Der 1-stellige Teil wird ebenfalls mit 0 gefüllt, so dass er 2-stellig wird.
String lessdig = "2019/1/2 3:4:5";   //Keine 0-Auffüllung für 1 Stelle
try{
    sdf.parse(zeropad);
    sdf.parse(lessdig);
...
(ParseException tritt nicht auf)

Dieses Verhalten wird in der API beschrieben.

Numerisch: Bei der Formatierung entspricht die Anzahl der Musterzeichen der Mindestanzahl der Ziffern. Zahlen, die kürzer als diese sind, werden auf diese Anzahl von Ziffern mit Nullen aufgefüllt. Die Anzahl der Musterzeichen wird für die Analyse ignoriert, es sei denn, Sie müssen zwei benachbarte Felder trennen.

** Die Anzahl der Zeichen wird ignoriert **.

Existenzdatum und -zeit prüfen die Spezifikationen der Eingabewerte

Für die Standard-Datumsprüfung von "parse (String)" (Ausdruck wie "strenge Analyse" in der API) Es gab eine Beschreibung in DateFormat API, einer Superklasse von SimpleDateFormat.

Standardmäßig ist die Analyse nicht streng. Wenn die Eingabe nicht das von der Formatmethode dieses Objekts verwendete Format hat, sondern als Datum analysiert werden kann, ist die Analyse erfolgreich.

SimpleDateFormat.parse(String) → DateFormat.parse(String) → DateFormat.parse(String, ParsePosition) Ich konnte zu der Beschreibung im Fluss kommen.

Nach der Beschreibung dieser API und dem obigen Satz wurde sie so geschrieben.

Der Client kann dieses Format strikt anfordern, indem er setLenient (false) aufruft.

Ich sehe, API ist das stärkste Dokument.

Wer ist setLenient (false)

Zusammenfassend ist es eine Methode der Klasse "Kalender". Calendar.setLinient(boolean)

Legen Sie fest, ob Datum und Uhrzeit streng interpretiert werden sollen. (Ausgelassen) Die Standardeinstellung ist nicht streng.

Dies passiert "wahr", wenn es Nicht-Strenge erlaubt, und "falsch", wenn es streng ist. Weil das Wort nachsichtig "locker" bedeutet Es entspricht den Argumenten "lose (wahr)" und "nicht locker (falsch)".

Die Überprüfung des tatsächlichen Datums kann einfach mit setLenient () implementiert werden.

Kurz gesagt

SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
sdf.setLenient(false);

Es wird nur eine strenge Datumsanalyse durchgeführt.

Recommended Posts

Überprüfen Sie das aktuelle Datum und die Uhrzeit beim Analysieren mit Javas SimpleDateFormat
Beispielcode zum Parsen von Datum und Uhrzeit mit Java SimpleDateFormat
Stellen Sie Datum und Uhrzeit aus der Zeichenfolge mit POI ein
Überprüfen Sie, wann Moos mit SimpleDateFormat analysiert wird
Das Designkonzept der Datums- und Uhrzeit-API von Java ist interessant
Zeichnen Sie mit MPAndroidChart gleichzeitig Balkendiagramm und Liniendiagramm
Datum (und Uhrzeit
Formatieren Sie das von created_at angegebene Datum und die Uhrzeit
Analysieren Sie die Datums- und Zeitzeichenfolge, die von der asctime-Funktion der C-Sprache in Java formatiert wurde
Geschwindigkeitsvergleich zum Zeitpunkt der Generierung zum Zeitpunkt der Datumskonvertierung
Verhalten beim gleichzeitigen Hinzufügen von RadioButton und Erstprüfung im Code festgestellt
[Schienen] Vorsichtsmaßnahmen beim Vergleich von Datum und Uhrzeit mit DateTime
Behandeln Sie die Java 8-Datums- und Uhrzeit-API mit Thymeleaf mit Spring Boot
Was ist die LocalDateTime-Klasse? [Java-Anfänger] -Datum und Zeitklasse-
[Java] Überprüfen Sie den Unterschied zwischen orElse und orElseGet mit IntStream
[Java] Verwenden Sie ResolverStyle.LENIENT, um Datum und Uhrzeit gut zu handhaben
[Rails] Erhalten Sie access_token zum Zeitpunkt der Twitter-Authentifizierung mit Sorcery und speichern Sie es in der Datenbank
Rufen Sie das aktuelle Datum und die aktuelle Uhrzeit ab, indem Sie die Zeitzone in Thymeleaf angeben
Die Beziehung zwischen strenger Java-Datumsprüfung und Sommerzeit
[MySQL] [Java] Datum und Uhrzeit empfangen
Anfänger erstellen Web-Apps mit Java und MySQL (jederzeit hinzufügen)
[Spring Boot] Poste Dateien und andere Daten gleichzeitig [Axios]
Zum Zeitpunkt der Neuregistrierung E-Mail-Sendefunktion mit Action Mailer
[Android] Überprüfen Sie die tatsächliche Maschine, ohne Ihre Hände mit automatischem Scrollen zu bewegen
Beim Formatieren mit SimpleDateFormat blieb ich beim Umgang mit Zeitzonen