Alteração de comportamento do SimpleDateFormat no Android Marshmallow
Eu encontrei um problema com a formatação de data no Android 6.0, Marshmallow. O código que lança a exceção mencionada abaixo é uma biblioteca Java pura (criada separadamente) que meu aplicativo usa para solicitações de API ("o cliente"). A biblioteca é construída com Java 1.6, se isso estiver relacionado ... de qualquer maneira, aqui está o código;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd E hh:mm aa", Locale.UK);
Date eventDate = dateFormat.parse(StringUtils.substring(record, 0, 23).trim());
...arecord
tem valor;
2015-10-23 Fri 10:59 PM BST 3.60 meters
... que após "aparar" é;
2015-10-23 Fri 10:59 PM
yyyy-MM-dd E hh:mm aa
Esse código funciona desde os bons e velhos tempos do Froyo e é testado em unidade. Tudo isso de lado Marshmallow lança a exceção;
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)
O deslocamento "21" é o espaço após o '9' em 10:59. Alguém pode explicar esse fracasso?
Atualizar
Mudou para joda-time e cuspiu uma mensagem de erro mais informativa. Aqui está;
Invalid format ... is malformed at "PM"
... então, trata-se do aspecto AM / PM da string tentando ser analisado - de volta paraos documentos