Simple nicht auf das Jahr des Eingangs Eingang fehlt Jahrhundert abzulehnen, trotz „yyyy“ in der Formatierung Muster

StackOverflow https://stackoverflow.com/questions/4410524

  •  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 ...

War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top