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.
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.
Überprüfen Sie die Beschreibung in Java8-API (SimpleDateFormat).
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 **.
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.
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)".
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