2010-02-08 12 views
34

Ich versuchteWie parse Monat Vollformularkette mit DateFormat in Java?

DateFormat fmt = new SimpleDateFormat("MMMM dd, yyyy"); 
    Date d = fmt.parse("June 27, 2007"); 

Exception in thread "main" java.text.ParseException: Unparseable date: "June 27, 2007"

Die Java-docs sagen, dass ich vier Zeichen verwenden sollten die volle Form entsprechen. Ich kann nur MMM erfolgreich mit abgekürzten Monaten wie "Jun" verwenden, aber ich muss Vollformular entsprechen.

Text: Für die Formatierung, wenn die Zahl der Musterbuchstaben 4 oder mehr beträgt, die volle Form verwendet wird; andernfalls wird eine kurze oder abgekürzte Form verwendet, wenn verfügbar ist. Für das Parsen werden beide Formulare akzeptiert, unabhängig von der Anzahl der Musterbuchstaben.

http://java.sun.com/j2se/1.6.0/docs/api/java/text/SimpleDateFormat.html

+2

Sie haben zwei Leerzeichen in Ihrer Datumszeichenfolge. –

+0

Sind Sie sicher, dass Sie Java 6 verwenden? Diese zwei Codezeilen, die du eingefügt hast, funktionieren gut für mich; keine Ausnahmen. – aberrant80

Antwort

88

Sie verwenden wahrscheinlich ein Gebietsschema, wo die Monatsnamen sind nicht „Januar“, „Februar“ usw., aber einige andere Wörter in Ihrer Landessprache.

Versuchen Sie das Gebietsschema, das Sie verwenden möchten, zum Beispiel Locale.US:

DateFormat fmt = new SimpleDateFormat("MMMM dd, yyyy", Locale.US); 
Date d = fmt.parse("June 27, 2007"); 

Auch Sie einen zusätzlichen Platz in der Datumszeichenfolge haben, aber tatsächlich hat dies keine Auswirkungen auf das Ergebnis. Es funktioniert so oder so.

+0

Hat der zusätzliche Speicherplatz einen Einfluss auf den Parse-Fehler? –

+0

@Beau Martínez: Nein, das hat keinerlei Wirkung. Ich habe meinen Kommentar aktualisiert, um diesen Punkt anzusprechen, da er nicht nur von Ihnen, sondern auch von anderen in den Kommentaren angesprochen wurde. –

2

Genau dies auf die neue Java 8 API aufzufüllen:

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("MMMM dd, yyyy").toFormatter(); 
TemporalAccessor ta = formatter.parse("June 27, 2007"); 
Instant instant = LocalDate.from(ta).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant(); 
Date d = Date.from(instant); 
assertThat(d.getYear(), is(107)); 
assertThat(d.getMonth(), is(5)); 

Etwas ausführlicher, aber Sie sehen auch, dass die Methoden der Datum verwendet veraltet sind ;-) Zeit auf sich zu bewegen.