SimpleDateFormat: Unparsable date at offset 0 - nur ab Android 4.4

  • Antworten:6
Rafael K.
  • Forum-Beiträge: 2.359

09.02.2014, 23:25:57 via Website

Hi Leute,

hab mal wieder ein Problem wo ich selbst nicht weiterkomme.
Ich parse ein Datum mit SimpleDateFormat und dem Pattern
1"dd. MMM. hh:mm"
Locale ist auf Locale.GERMANY gesetzt.

Derselbe Code läuft unter Android < 4.4 sauber durch, ab 4.4 bekomme ich z.B. den Fehler:
ParseException: Unparseable date "15. Feb. 13:45" (at offset 0)

Das Pattern ist ja wohl für die Eingabe korrekt und auch die Eingabe ist durch einen Regex gematcht, also enthält keine außer der erlaubten Zeichen.
Woran kann das liegen? Gibt es in 4.4 Änderungen von denen ich nichts weiß`?

Danke und Grüße,
Rafael

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

10.02.2014, 05:03:16 via App

Muss das Februar nicht ausgeschrieben Werde da dein Pattern 4x M enthält?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Mac Systems
  • Forum-Beiträge: 1.727

10.02.2014, 11:36:03 via Website

Gesehen habe Ich das problem nocht nicht, auch die Whats new in Android Talks waren da nicht drauf eingegangen. Das Diff sieht aber auch so aus als ob es da nicht neues gibt.

http://developer.android.com/sdk/api_diff/19/changes.html

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

13.02.2014, 03:10:38 via Website

Hmm...danke.
Nun wird es aber wirklich weird.
Ich hatte erstmal die "hh:mm" in Verdacht und habe es auf "HH:mm" geändert, für 24h Format.
Kein Erfolg. Dann das:

Wenn ich im Eingabe String die Punkte lösche
1temp = temp.replace(".", "");

und das Pattern auf
1"dd MMM HH:mm"

ändere, geht es 8o

Das einzige was in dem Zusammenhang Sinn macht, ist dass mein Eingabestring eine andere Repräsentation des Punktes enthält, als das Pattern.
Nur warum geht es dann in den vorherigen Android Versionen?

— geändert am 13.02.2014, 03:14:18

Antworten
Rafael K.
  • Forum-Beiträge: 2.359

14.06.2015, 12:35:19 via Website

Ich hole den Thread mal wieder hervor, denn seit Lollipop gibt es da wohl wieder eine Änderung ... JUHU !

Na einigem Suchen im Debugger habe ich herausgefunden was der Grund für den Fehler war.
Von Version zu Version wurden scheinbar die "shortMonthNames" geändert, und/oder die Logik, die für den Monat ein Substring-Matching macht.

Wenn man im Debugger die SimpleDateFormat Instanz inspiziert, sieht man den Array von Monatsnamen in voller, kurzer und standalone Schreibweise.
Also "Januar, Februar, März,..."
"Jan., Feb., Mär., Apr., Mai, Juni" (gemischt mit/ohne Punkt)
"Jan, Feb, Mär" (ohne Punkt)

Lustigerweise verwendet er strikt die Werte aus dem Array für "short" obwohl die aus dem Array für Standalone perfekt passen würden und ich habe auf die Schnelle auch nicht finden können wie man ihm sagt welche Reihe von Namen er verwenden soll.
Auch ist es komisch, dass die Notation mit und ohne Punkt gemischt wird und dass "Juni" ausgeschrieben wird.
Damit ist aber auch klar, warum meine Monate mit 3 Zeichen und OHNE Punkt nicht matchen.

Immerhin, kann man die Werte in diesen Arrays aber explizit setzen, so dass man mit folgendem Beispiel-Code ein konsistentes Verhalten über alle Versionen bekommen sollte. Hoffe ich zumindest :)

    this.sdf = new SimpleDateFormat(datePattern, locale);
    DateFormatSymbols dateFormatSymbols = new DateFormatSymbols(locale);
    dateFormatSymbols.setShortMonths(
               new String[] {"Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"});
    sdf.setDateFormatSymbols(dateFormatSymbols);

— geändert am 14.06.2015, 12:40:59

Antworten
Sven R.
  • Forum-Beiträge: 1.904

14.06.2015, 19:27:14 via App

Vielen Dank fürs Teilen der Lösung!

Wenn dir mein Beitrag gefällt, kannst dich einfach mit dem 👍 "Danke"-Button auf der Website dieses Forums bedanken. 😀

Why Java? - Because I can't C#

Antworten