Simple nicht auf das Jahr des Eingangs Eingang fehlt Jahrhundert abzulehnen, trotz „yyyy“ in der Formatierung Muster
-
08-10-2019 - |
Frage
Ich habe ein Simple mit dem Muster yyyy-M-d"
und das folgende Szenario vor:
String str = "02-03-04";
SimpleDateFormat f = new SimpleDateFormat("yyyy-M-d");
f.setLenient(false);
System.out.println(f.parse(str));
Der Ausgang ist Sat Mar 04 00:00:00 EST 2
Mein Ziel war es, nur Daten in dem Format wie 2004-02-03 zu fangen und 02-03-04 zu ignorieren. Ich dachte, die yyyy im Muster wäre ein 4-stelliges Jahr erfordern, aber deutlich ist dies nicht der Fall ist. Kann mir jemand erklären, warum dies nicht eine Parse-Ausnahme zu werfen? Ich mag es ...
Lösung
Nun, ich kann es von die erklären docs :
Für das Parsen, wenn die Anzahl der Musterbuchstabe mehr als 2 ist, wird das Jahr wörtlich interpretiert, unabhängig von der Anzahl der Ziffern. So mit dem Muster "MM / tt /", "01/11/12" Parsen Jan 11, 12 A.d.
Es ist möglich, dass Joda Zeit würde strenger sein - und es ist eine bessere API im Allgemeinen IMO .. .
Sie können immer eine Ausnahme auslösen, wenn das Jahr weniger als 1000 nach dem Parsen ...
Andere Tipps
tl; dr
Mit java.time , dass die Eingabe mit dieser Formatierung Muster fehlschlägt, so wie Sie erwartet.
LocalDate
.parse(
"02-03-04" ,
DateTimeFormatter.ofPattern ( "uuuu-M-d" )
)
... wirft java.time.format.DateTimeParseException
java.time
Die Klassen, die Sie wurden unter Verwendung werden nun von der modernen verdrängte java.time Klassen definiert in JSR 310 und gebaut in Java 8 und höher.
Die LocalDate
Klasse repräsentiert ein Datum Wert nur ohne Zeit-of-Tag und ohne Zeitzone oder Offset-from-UTC .
Definieren Sie eine benutzerdefinierte Formatierung Muster wie Sie gefragt. Verwenden Sie die DateTimeFormatter
Klasse.
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "uuuu-M-d" );
Versuchen Sie Ihre Eingabe zu analysieren.
String input = "02-03-04";
LocalDate localDate = LocalDate.parse ( input , f );
Wir stoßen auf eine DateTimeParseException
, auf das fehlende Jahrhundert des Jahres des Eingangs versagt. So wie Sie erwartet.
Exception in thread "main" java.time.format.DateTimeParseException: Text '02 -03-04' konnte nicht bei Index 0
analysiert werden
über java.time
Die Vermächtnis Datum Zeitklassen wie java.util.Date
, Calendar
& SimpleDateFormat
.
Um mehr zu erfahren, finden Sie in der Oracle Tutorial . Und Stack-Überlauf suchen viele Beispiele und Erklärungen. Spezifikation JSR 310 .
Die Joda-Time Projekt jetzt in < a href = "https://en.wikipedia.org/wiki/Maintenance_mode" rel = "nofollow noreferrer"> Wartungsmodus , rät Migration auf die java.time Klassen.
können Sie tauschen java.time Objekte direkt mit Ihrer Datenbank. Verwenden Sie einen JDBC-Treiber kompatibel mit JDBC 4.2 oder höher. Keine Notwendigkeit für Streicher, keine Notwendigkeit für java.sql.*
Klassen.
Wo die java.time Klassen erhalten?
- Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 , und später - Ein Teil des Standard-Java-API mit einer gebündelten Implementierung.
- Java 9 fügt einige kleinere Features und Korrekturen.
- Java SE 6 und Java SE 7
- Die meisten des java.time Funktionalität zurückzuportiert zu Java 6 & 7 in Android
- Spätere Versionen von Android-Bundle Implementierungen der java.time Klassen.
- Für frühere Android (<26), die ThreeTenABP Projekt passt sich an ThreeTen-Backport (wie oben erwähnt). Siehe So verwenden ThreeTenABP ... .
Die ThreeTen-Extra Projekt erstreckt java.time mit zusätzlichen Klassen. Dieses Projekt ist eine Bewährungsprobe für eine mögliche zukünftige Ergänzungen java.time. Sie können einige nützliche Klassen hier wie
Interval
YearWeek
,YearQuarter
und mehr . - Die meisten des java.time Funktionalität zurückzuportiert zu Java 6 & 7 in Android