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

One Solution collect form web for “Cambio de comportamiento de SimpleDateFormat en Android Marshmallow”

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

  • Encabezado de cookie no válido: no se puede analizar el atributo expires cuando el atributo expires está vacío
  • Cómo enviar el archivo .apk dentro de la aplicación mediante Bluetooth
  • Cómo agregar una segunda lista desplegable a la barra de acción en Android Honeycomb?
  • Nullpointerexception en dispatchDraw con ViewPager en fragmento anidado con PageTransformer
  • Android y JNI cómo pasar una matriz de datos Byte a JNI y recuperar Byte
  • Android: ¿cómo cambiar el color del divisor datepicker?
  • PDF Viewer API para android
  • Pestaña de Logcat en Eclipse DDMS Persepctive (complemento ADT de Android) no aparece en blanco
  • ¿Cómo puede hacer que el reconocimiento de voz del soporte para el emulador android
  • Cómo carga fragmento en ViewPager sólo cuando su seleccionado
  • Biblioteca de validación de formularios para Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.