2017-07-17 2 views
4
import java.text.ParseException; 

public class Hello { 

    public static void main(String[] args) throws ParseException { 
     System.out.println(new java.text.SimpleDateFormat("yyyy-MM-dd").parse("23-06-2015")); 
    } 
} 

Warum gibt das zurück Sun Dec 05 00:00:00 GMT 28 Ich erwarte eine Ausnahme.Warum SimpleDateFormat keine Ausnahme für ungültiges Format auslöst?

+0

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

+0

Versuchen Sie es stattdessen: 'java.time.format.DateTimeFormatter.ofPattern (" yyyy-MM-dd "). Parse (" 23-06-2015 ");', wenn Sie Java8 verwenden. – sndyuk

+0

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

Antwort

6

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.

+2

Auch wenn Sie die JavaDoc für 'Parse'-Methode in einer 'DateFormat'-Klasse lesen, können Sie als nächstes sehen: * Standardmäßig ist das Parsen nachsichtig: Wenn die Eingabe nicht in der Form der Formatmethode dieses Objekts ist, aber trotzdem analysiert werden kann als ein Datum, dann ist das Parse erfolgreich. Kunden können darauf bestehen, das Format strikt einzuhalten, indem sie setLenient (false) aufrufen. * –

+1

Danke @AlexChermenin - wird damit aktualisiert. – slim

+0

Vielen Dank. – Amit

Verwandte Themen