Der Eingang hat Wochentag und Monatsnamen in Englisch, so ist es pr möglicherweise ein Gebietsschema Problem. SimpleDateFormat
verwendet das Standardgebietsschema des Systems, wenn Sie keines angeben - überprüfen Sie den Wert java.util.Locale.getDefault()
in Ihrem System, wahrscheinlich wird es nicht en
(Englisch) sein.
Wenn Sie das Gebietsschema festgelegt, sollten die Dinge funktionieren:
DateFormat formatter = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
formatter.parse("Mon Dec 14 13:25:00 CET 2015"));
Neue Java Date/Time API
Die alten Klassen (Date
, Calendar
und SimpleDateFormat
) haben lots of problems und design issues und Sie werden durch die neuen APIs ersetzt. Wenn Sie Java 8 verwenden, ziehen Sie die Verwendung der new java.time API in Betracht. Es ist einfacher, less bugged and less error-prone than the old APIs.
Wenn Sie mit Java < = 7, können Sie die ThreeTen Backport, eine große Rückportierung für neue Java-8s Datum/Zeit-Klassen verwenden. Und für Android gibt es die ThreeTenABP (mehr darüber, wie man es verwendet here).
Der folgende Code funktioniert für beide. Der einzige Unterschied ist die Paketnamen (in Java 8 ist java.time
und in ThreeTen Backport (oder Android ThreeTenABP) ist org.threeten.bp
), aber die Klassen und Methoden Namen sind die gleichen.
Ein großer Unterschied ist, dass die neue API IANA timezones names (immer im Format Continent/City
, wie America/Sao_Paulo
oder Europe/Berlin
) verwendet. Vermeiden Sie die 3-Buchstaben-Abkürzungen (wie CET
oder), weil sie ambiguous and not standard sind.
Sie können eine Liste der verfügbaren Zeitzonen (und wählen Sie die, die am besten zu Ihrem System passt), indem Sie ZoneId.getAvailableZoneIds()
aufrufen. In Ihrem Fall ist CET
eine Abkürzung für „Central European Time“, aber es gibt mehr als 30 verschiedene Regionen (oder Zeitzonen), die CET
Abkürzung verwendet:
Europe/Ljubljana, Europe/Rome, Atlantic/Jan_Mayen, Europe/Berlin, Africa/Ceuta, Africa/Algiers, Europe/Zurich, Europe/Oslo, Europe/Amsterdam, Poland, Europe/Stockholm, Europe/Vatican, Europe/Budapest, Europe/Gibraltar, Europe/Bratislava, Europe/San_Marino, Europe/Madrid, Europe/Zagreb, Europe/Copenhagen, Europe/Malta, Europe/Brussels, Europe/Vienna, Europe/Busingen, Europe/Vaduz, Europe/Warsaw, Europe/Prague, Europe/Skopje, Europe/Podgorica, Europe/Paris, Africa/Tunis, Europe/Sarajevo, Europe/Tirane, Europe/Luxembourg, Europe/Andorra, Europe/Belgrade, Arctic/Longyearbyen, Europe/Monaco
ich einen für diesen Test ausgewählt habe, fielen aber Wählen Sie den für Ihr System am besten geeigneten aus.
// create formatter (this is thread-safe, while SimpleDateFormat isn't)
DateTimeFormatter fmt = new DateTimeFormatterBuilder()
// pattern for date/time
.appendPattern("EEE MMM dd HH:mm:ss ")
// timezone (use Europe/Berlin as prefered value for CET)
.appendZoneText(TextStyle.SHORT, Collections.singleton(ZoneId.of("Europe/Berlin")))
// year
.appendPattern(" yyyy")
// use English locale to parse weekday and month name
.toFormatter(Locale.ENGLISH);
// ZonedDateTime is a date and time with a timezone
ZonedDateTime z = ZonedDateTime.parse("Mon Dec 14 13:25:00 CET 2015", fmt);
System.out.println(z); // 2015-12-14T13:25+01:00[Europe/Berlin]
Der Ausgang wird sein:
wird
System.out.println(z.format(fmt)); // Mon Dec 14 13:25:00 CET 2015
Der Ausgang:
2015-12-14T13:25+01:00[Europe/Berlin]
Wenn Sie ein benutzerdefiniertes Format möchten, können Sie die Formatierungs auch verwenden können
Mon Dec 14 13:25:00 CET 2015
http://stackoverflow.com/questions/2009207/java-unparseable-date-exception –
Bitte können Sie testen ... Ich habe viele Post durch ... aber immer noch bekommen Fehler ... @IntelliJAmiya Es wird wirklich hilfreich sein ... –