Die Javadoc SimpleDateFormat
hat dies über wiederholendes Muster Buchstaben zu sagen:
Nummer: die Anzahl der Musterbuchstaben Für die Formatierung ist die minimale Anzahl der Ziffern und kürzere Zahlen sind mit Nullen aufgefüllt, um diesen Betrag . Für Parsing wird die Anzahl der Musterbuchstaben ignoriert wenn es zwei benachbarte Felder benötigt
(Hervorhebung von mir) entspricht "y-M-d"
So zum Parsen, "yyyy-MM-dd"
ist zu trennen.
Mit diesem Muster wird "23-06-2015"
als year = 23, month = 6, dayOfMonth = 2015
geparst.
standardmäßig wird dieses Problem gelöst, indem am 1. ab Juni 0023 und Zählung 2015 Tage vor, Sie bis 5. Dezember 0028. Einnahme
Sie dieses Verhalten mit SimpleDateFormat.setLenient(false)
ändern kann - mit Nachsicht deaktiviert, wird es werfen eine Ausnahme für Nummern außerhalb des gültigen Bereichs. Dies wird ordnungsgemäß dokumentiert in Calendar.setLenient()
Hinweis, für neuen Code in Java 8, es ist eine gute Idee, die alten Date
und Calendar
Klassen zu vermeiden. Verwenden Sie LocalDateTime.parse(CharSequence text, DateTimeFormatter formatter)
, wenn Sie können.
Sie können kein date-Objekt von einem String-Datum in einem formatierten Zustand abrufen. Wenn Sie also versuchten, das Datum zu formatieren, gab Ihnen JVM unabhängig von Ihrem Format ein generisches Datum. – Anant666
Versuchen Sie es stattdessen: 'java.time.format.DateTimeFormatter.ofPattern (" yyyy-MM-dd "). Parse (" 23-06-2015 ");', wenn Sie Java8 verwenden. – sndyuk
Weil 'SimpleDateFormat' auf diese Weise entworfen wurde. Es hat sich als schlechte Designentscheidung herausgestellt. Sie können die erwartete Ausnahme erhalten, wenn Sie 'setLenient (false)' auf Ihrem 'SimpleDateFormat' vor dem Parsen aufrufen. Aber die gute Lösung ist die, die @sndyuk vorschlägt: Überspringe 'SimpleDateFormat' komplett und benutze' DateTimeFormatter'. Wenn Sie Java 8 noch nicht verwenden, können Sie es im [ThreeTen Backport] (http://www.threeten.org/threetenbp/) abrufen. –