2012-04-08 5 views
4

Ich versuche String in Datum zu konvertieren.SimpleDateFormat - Nicht übertragbares Datum

Hier ist mein Code:

SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"); 
    Date date = format.parse("Sun Apr 08 16:37:00 CEST 2012"); 

ich Ausnahme:

04-08 13: 51: 36,536: W/System.err (8005): java.text.ParseException: Ungültiges Datum: "So Apr 08 16:37:00 CEST 2012".

Das Format scheint in Ordnung zu sein. Fehle ich etwas?

Danke.

+1

Ja. Eine zweite 'd' –

+0

Danke, aber immer noch die gleiche Ausnahme. – Domiik

+0

Nein, tut es nicht. Versuchen Sie, Ihren Code neu zu kompilieren, nachdem Sie Änderungen vorgenommen haben. (Es sei denn, Sie haben ein seltsames Gebietsschema-Problem) –

Antwort

-1

Es sieht aus wie "Sun" wird nicht erkannt. Versuchen Sie folgendes:

date = format.parse("Sunday Apr 08 16:37:00 CEST 2012"); 

Arbeiten für mich.

+1

Laut http://docs.oracle.com/javase/6/docs/api/java/text/SimpleDateFormat.html ist es egal, ob es die Abkürzung (Sun) oder das ganze Wort (Sonntag) ist. – Rob

7

Entweder ist der von Ihnen gepostete Code nicht Ihr tatsächlicher Code oder Sie haben ein lokales Problem. Es funktioniert gut auf Sun Oracle Java 1.6 mit einem US-Gebietsschema.

Code ändern zu:

SimpleDateFormat format = 
    new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US); 
+2

+1 War es nötig, Sun zu erwähnen? ;) –

+1

Heh - siehe meine Notiz. Ich musste wirklich zurückgehen und es ändern ... Ich werde mich nie an "Oracle Java" gewöhnen –

5

SimpleDateFormatLocale spezifisch ist. Zumindest das Muster E und M sind länderspezifisches, weil zum Beispiel „Sun“ oder „Sonntag“ wird nicht für Locale.GERMAN passen oder Locale.FRENCH etc. Sie besser die verwendeten Locale

SimpleDateFormat format = new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US); 

oder angeben, Format, das nicht länderspezifisch ist.

2

Die anderen Antworten waren in Ordnung Antworten im Jahr 2012. Hier ist ein Beispiel dafür, wie mit den modernen (2014) Java Datum und Uhrzeit Klassen zu tun: von einer doppelten Frage

System.out.println("date de la requete est " + dateq); 
    DateTimeFormatter dtf = DateTimeFormatter 
      .ofPattern("EEE MMM dd HH:mm:ss xx uuuu", Locale.ROOT); 
    OffsetDateTime dateTime1 = OffsetDateTime.parse(dateq, dtf); 

    System.out.println("new date " + dateTime1); 

Das Codebeispiel wurde inspiriert (als Ich sehe es), How to convert Xml String date to int in java. Mit dem Beispiel String aus dieser Frage druckt:

date de la requete est Tue Feb 08 12:30:27 +0000 2011 
new date 2011-02-08T12:30:27Z 

Q: (?) Ich kann nicht die neueren Klassen auf Android verwenden

A: Ja, das können Sie. Verwenden Sie für Android den speziell auf Android zugeschnittenen Backport, ThreeTenABP. Verwenden Sie andernfalls für Java 6 und 7 ThreeTen Backport.

Q: Ihr Code funktioniert nicht für die Datum-Uhrzeit-Zeichenfolge in diese Frage!

A: (1) Wenn möglich, vermeiden Sie die drei- und vierstelligen Zeitzonenabkürzungen wie CEST. Viele sind mehrdeutig und die Interpretation kann sogar mit der aktuellen Zeitzoneneinstellung Ihrer JVM variieren. CEST ist nur die Sommerhälfte einer Zeitzone, keine Vollzeitzone. (2) Wenn Sie keine Zeichenfolge ohne CEST oder ähnlich darin erhalten können, versuchen Sie ZonedDateTime anstelle von OffsetDateTime und verwenden Sie zzz im Format Muster wie in der Frage. Dies funktioniert im Beispiel und erzeugt 2012-04-08T16:37+02:00[Europe/Paris].

Frage: Wie verwende ich die neueren Klassen?

A: Ein guter Ausgangspunkt ist die Oracle Tutorial.

Q: Locale.ROOT ??

A: Wenn Ihr Datum/Uhrzeit-String von einem bestimmten Ort in der Welt und in der Sprache dieses Ortes kommt, verwenden Sie natürlich das entsprechende Gebietsschema. Wenn es nur auf Englisch ist, weil Computersysteme überall dazu neigen, Englisch auszugeben, verwende ich lieber Locale.ROOT für das Gebietsschema "neutrales Gebietsschema", wie "nichts Gebietsspezifisches hier tun".