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:
- Mostrar la fecha / hora UTC en la fecha / hora de acuerdo con la zona horaria actual
- Datetime ('ahora') da tiempo equivocado
- Cómo obtener el día, año, horas, min Individualmente a partir del formato de fecha "aaaa-MM-dd'T'HH: mm: ss.SSSZ"?
- Conversión de String en DateTime: Android
- Convertir una cadena de fecha en milisegundos en java
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?
- ¿Cómo configurar el formato de 24 horas para la fecha en java?
- Anular el primer día de la semana en joda?
- Obtener diferencia de tiempo en android?
- ¿Cómo manejar las diferencias de la base de datos de horarios de JodaTime y Android?
- Implementar etiquetas de fecha y hora continuas en el eje x de mpandroidchart
- Cómo incrementar el tiempo en 1 hora
- Android: Obtener la fecha y la hora de un servidor NTP
- Cómo obtener el tiempo y la fecha del sello de fecha y hora
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.
- Completion Handlers en Android
- Ejecutar zipalign con la recompresión zopfli después de construir APK desde la línea de comandos para hacerlo más pequeño