Convertir la cadena en 12 (PM / AM) Hora AM PM Tiempo para 24 horas android

Tengo un problema en tiempo del convertido que viene del servidor y quiero convertirlo a 24 horas. Estoy usando el siguiente código:

String timeComeFromServer = "3:30 PM"; SimpleDateFormat date12Format = new SimpleDateFormat("hh:mm a"); SimpleDateFormat date24Format = new SimpleDateFormat("HH:mm"); try { ((TextView)findViewById(R.id.ahmad)).setText(date24Format.format(date12Format.parse(timeComeFromServer))); } catch (ParseException e) { e.printStackTrace(); } 

Hay el error:

El método lanzó la excepción 'java.text.ParseException'.

El mensaje de error detallado es:

Fecha inescrutable: "3:30 PM" (en la compensación 5)

Pero si reemplazo PM a pm funciona sin ningún problema como este:

  timeComeFromServer = timeComeFromServer.replaceAll("PM", "pm").replaceAll("AM", "am"); 

¿Puede cualquiera decirme cuál es la manera correcta?

SimpleDateFormat utiliza la configuración regional predeterminada del sistema (que puede comprobar utilizando la clase java.util.Locale , llamando a Locale.getDefault() ). Esta configuración regional es específica de dispositivo / entorno, por lo que no tiene control sobre ella y puede tener resultados diferentes en cada dispositivo.

Y algunos locales pueden tener un formato diferente para el campo AM / PM. Ejemplo:

 Date d = new Date(); System.out.println(new SimpleDateFormat("a", new Locale("es", "US")).format(d)); System.out.println(new SimpleDateFormat("a", Locale.ENGLISH).format(d)); 

La salida es:

pm
PM

Para no depender de eso, puede utilizar Locale.ENGLISH en sus formateadores, por lo que no dependerá de la configuración predeterminada del sistema / dispositivo:

 String timeComeFromServer = "3:30 PM"; // use English Locale SimpleDateFormat date12Format = new SimpleDateFormat("hh:mm a", Locale.ENGLISH); SimpleDateFormat date24Format = new SimpleDateFormat("HH:mm"); System.out.println(date24Format.format(date12Format.parse(timeComeFromServer))); 

La salida es:

15:30

El segundo formateador no necesita una configuración local específica, ya que no se trata de información específica de la configuración regional.


Nueva API de fecha / hora de Java

Las clases viejas ( Date , Calendar y SimpleDateFormat ) tienen muchos problemas y problemas de diseño y se están reemplazando por las nuevas API.

Un detalle es que SimpleDateFormat siempre funciona con objetos Date , que tiene la marca de tiempo completa (el número de milisegundos desde 1970-01-01T00:00Z ), y las dos clases implícitamente usan la zona horaria predeterminada del sistema detrás de las escenas , lo que puede inducir a error y generar Inesperado y difícil de depurar los resultados. Pero en este caso específico, sólo necesita los campos de tiempo (hora y minutos) y no hay necesidad de trabajar con valores de marca de tiempo. La nueva API tiene clases específicas para cada caso, mucho mejor y menos propenso a errores.

En Android puede utilizar el Backport de ThreeTen , un gran backport para las nuevas clases de fecha / hora de Java 8. Para que funcione, también necesitará ThreeTenABP (más información sobre cómo usarlo aquí ).

Puede usar un org.threeten.bp.format.DateTimeFormatter y analizar la entrada en un org.threeten.bp.LocalTime :

 String timeComeFromServer = "3:30 PM"; DateTimeFormatter parser = DateTimeFormatter.ofPattern("h:mm a", Locale.ENGLISH); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm"); LocalTime time = LocalTime.parse(timeComeFromServer, parser); System.out.println(time.format(formatter)); 

La salida es:

15:30

Para este caso específico, también puede utilizar time.toString() para obtener el mismo resultado. Puede consultar javadoc para obtener más información sobre la API de backport.

  • Cómo imprimir local timezone en formato posix en java (android)?
  • ¿Cómo activar o no la opción "Fecha y hora automáticas"?
  • Cómo desactivar la configuración de fecha y hora en Android?
  • Formato de fecha y hora de Android
  • Forma correcta de dar formato a la fecha con cadenas como hoy, ayer, mañana, etc
  • System.currentTimeMillis () devuelve la hora UTC?
  • Conversión de datetime en cadena, horas incorrectas
  • Convertir la hora de la época en la fecha y la hora de la fecha en la época en Android
  • Diferencia, en minutos, entre dos fechas
  • SimpleDateFormat toma demasiado tiempo cuando se incluye la zona horaria
  • Android Date.toLocaleString () - sin elementos de tiempo?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.