2015-10-23 13 views
6

Ich habe ein Problem mit Datumsformatierung auf Android 6.0, Marshmallow gefunden. Der Code, der die unten angegebene Ausnahme auslöst, ist eine (separat erstellte) Java-Bibliothek, die von meiner Anwendung für API-Anfragen ("der Client") verwendet wird. Die Bibliothek ist mit Java 1.6 gebaut, wenn das zusammenhängt ... wie auch immer, hier ist der Code;SimpleDateFormat Verhaltensänderung in Android Marshmallow

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd E hh:mm aa", Locale.UK); 
Date eventDate = dateFormat.parse(StringUtils.substring(record, 0, 23).trim()); 

... die record hat Wert;

2015-10-23 Fri 10:59 PM BST 3.60 meters 

... was nach "Trimmen" ist;

Dieser Code hat seit den guten alten Tagen von Froyo funktioniert und ist Unit-getestet. All dies beiseite Marshmallow wirft die Ausnahme;

10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: SynchroniseTidePosition.doInBackground 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException: java.text.ParseException: Unparseable date: "2015-10-23 Fri 10:59 PM" (at offset 21) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at java.text.DateFormat.parse(DateFormat.java:579) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at com.oceanlife.rover.handler.XTideParser.parseResponse(XTideParser.java:69) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at com.brantapps.oceanlife.task.SynchroniseTidePosition.doInBackground(SynchroniseTidePosition.java:107) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at com.brantapps.oceanlife.task.SynchroniseTidePosition.doInBackground(SynchroniseTidePosition.java:43) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at android.os.AsyncTask$2.call(AsyncTask.java:295) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
10-23 21:01:56.816 4091-4110/com.oceanlife E/ParseException:  at java.lang.Thread.run(Thread.java:818) 

Offset "21" ist der Abstand nach der '9' in 10:59. Kann jemand diesen Fehler erklären?

aktualisiert

zu joda Zeit umgeschaltet und es spie Nachricht einer informative Fehlers aus. Hier ist es;

Invalid format ... is malformed at "PM" 

... so, hier geht es um den AM/PM Aspekte der Zeichenfolge versucht analysiert werden - zurück zum the docs

+0

Aufnahme im Dunkeln: Können Sie bestätigen, dass Ihre Strings nicht in einer UTF-8/UTF-16-Codierung vorliegen? –

+0

Hallo @MorrisonChang - Strings werden mit dem Zeichensatz analysiert; Charset.forName ("UTF-8") Was denkst du? – OceanLife

+0

Sorry, nur Ideen auswerfen. Fanden Sie dies: http://stackoverflow.com/questions/24399846/android-simpledateformat-parsing-error (aber würde nicht den vorherigen Unit-Test-Erfolg erklären) und dies: https://code.google.com/p/android/issues/detail? id = 158265. Auch hier kann mehr Lärm als nicht so entschuldigen, wenn es ist. –

Antwort

12

Der britischen Locale scheint seine Definitionen von „am“ hatte und " Uhr "verändert.

In Marshmallow der UK Locale hat jetzt "am" als "a.m." dargestellt und "pm" von "p.m."

String record = "2015-10-23 Fri 10:59 p.m. BST 3.60 meters" 
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd E hh:mm aa", Locale.UK); 

// note the length is 25 now, not 23... 
Date eventDate = dateFormat.parse(StringUtils.substring(record, 0, 25).trim()); 

Ich kann keine Erklärung bieten, warum, aber die US-Locale arbeitet mit am/pm und Großbritannien mit a.m./p.m.

bearbeiten

Es scheint, dass im Rahmen des Locale Updates März 2015, der en_gb locale ersetzt seine am/pm Definitionen hatte. source diff

+0

Vielen Dank dafür. Ich ändere nur meine Änderungen von letzter Nacht, um zum Testen auf das US-Gebietsschema umzuschalten. – OceanLife

+1

Das hat es behoben! Danke - tick und ein +1. Ziemlich sicher, dass dies eine beliebte Antwort sein wird, wenn Apps aktualisiert werden, um Marshmallow zu unterstützen. Gut gemacht. Jetzt auf Laufzeitberechtigungen! – OceanLife

Verwandte Themen