Cambio de comportamiento de SimpleDateFormat en Android Marshmallow

He encontrado un problema con el formato de fecha en Android 6.0, Marshmallow. El código que arroja la excepción que se indica a continuación es una biblioteca de Java pura (construida por separado) que mi aplicación utiliza para solicitudes de API ("el cliente"). La biblioteca está construida con Java 1.6 si eso está relacionado … de todos modos, aquí está el 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()); 

… el record tiene valor;

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

… que después de "recortar" es;

 2015-10-23 Fri 10:59 PM yyyy-MM-dd E hh:mm aa 

Este código ha funcionado desde los buenos tiempos de Froyo y es probado en unidades. Todo eso aparte, Marshmallow lanza la excepción;

 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" es el espacio después del '9' en 10:59. ¿Alguien puede explicar este fracaso?

Actualizar

Cambiado a joda-tiempo y escupió un mensaje de error más informativo. Aquí está;

 Invalid format ... is malformed at "PM" 

… por lo tanto, esto es sobre el aspecto AM / PM de la cadena que intenta ser analizada – de nuevo a los documentos

El Reino Unido Locale parece haber tenido sus definiciones de "am" y "pm" alterado.

En Marshmallow la Localidad del Reino Unido ahora tiene "am" representado como "am" y "pm" por "pm"

 String record = "2015-10-23 Fri 10:59 pm 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()); 

No puedo ofrecer una explicación de por qué, pero la US Locale trabaja con am / pm y el Reino Unido con am / pm

Editar

Parece que, como parte de las actualizaciones de Locale en marzo de 2015, la en_gb regional de en_gb ha reemplazado sus definiciones de am / pm. Dif de origen

  • No se puede cargar la clase com.android.build.gradle.managed.NdkConfig $ Impl
  • ¿Cómo aplicar span de fila en tablelayout?
  • Android - Escribir un componente personalizado (compuesto)
  • Parche para Android - 9
  • Android: WebView cargar imagen / contenido en el centro
  • ¿Cómo usar SQLiteOpenHelper sin el uso menos restrictivo de Contexto?
  • Convertir doble en cadena
  • Android ViewGroup.setScaleX () hace que la vista se recorte
  • Rotación del videobuffer real en Videoview
  • Java.lang.RuntimeException: Error al entregar el resultado ResultInfo mientras se registra usando Facebook
  • Desarrollo / implementación de Linux para Samsung Galaxy S3
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.