Tengo una lógica para extraer la hora exacta de la fecha dada (por ejemplo, 12:00 PM p. m.).
Al final de la lógica, estoy usando SimpleDateFormat para analizar la fecha. Cuando ejecuto el código en los dispositivos Android, todo funciona bien. Además, cuando ejecuto las pruebas unitarias en mi MacBook, sistema operativo Windows y canalización de Bitbucket, todas las pruebas pasan. Pero, cuando ejecuto las pruebas unitarias en la MacBook M1-pro 2021 con el mismo estudio y código base de Android, una de las pruebas falla.
Esta es la parte del código para formatear la fecha:
val output = SimpleDateFormat("hh:mm a") return output.format(date) El resultado esperado es algo así como 12:00 PM . m., lo cual está totalmente bien en los escenarios que mencioné.
esta es la interfaz de usuario en mi dispositivo Android:
Pero en el MacBook M1-pro 2021 , la prueba falla porque el formateador devuelve las 12:00 pm . m.:
expected: 12:00 PM but was : 12:00 pmEste es el resultado de la prueba unitaria en MacBook M1-pro 2021
Supongo que está confiando implícitamente en la configuración regional predeterminada actual de JVM, y esa configuración regional difiere entre sus diversos entornos de prueba.
O está utilizando diferentes versiones de Java o Android que tienen diferentes definiciones de las reglas locales.
Y, otro problema: está utilizando clases de fecha y hora terribles que fueron suplantadas hace años por las clases java.time modernas definidas en JSR 310.
Las clases java.time se incluyen con Java 8+ y con Android 26+. Para versiones anteriores de Android, use las herramientas más recientes para proporcionar la mayor parte de la funcionalidad de java.time a través de la "desazucaración de API".
Convierta su clase heredada java.util.Date en su reemplazo java.time.Instant llamando a nuevos métodos de conversión agregados a las clases antiguas.
Instant instant = myJavaUtilDate.toInstant() ;Ajústese a su zona horaria deseada.
ZoneId z = ZoneId.of( "America/Edmonton" ) ; ZonedDateTime zdt = instant.atZone( z ) ;Extrae la porción de tiempo, el foco de tu Pregunta.
LocalTime lt = zdt.toLocalTime() ; Localiza automáticamente la salida. Especifique la Locale explícitamente. El Locale determina el idioma humano y las normas culturales que se aplicarán en la localización.
Locale locale = Locale.CANADA ; DateTimeFormatter f = DateTimeFormatter.ofLocalizedTime( FormatStyle.SHORT ).withLocale( locale ) ; String output = lt.format( lt ) ;Tenga en cuenta que Java 9 cambió su comportamiento predeterminado para usar el conjunto mucho más rico de definiciones de configuración regional en el Repositorio de datos de configuración regional común (CLDR) proporcionado por Unicode Consortium. Este cambio puede generar algunas diferencias, como el formato AM/PM. Además, los datos CLDR continúan evolucionando, por lo que las versiones posteriores pueden cambiar algunas reglas.
Es posible que Android también haya cambiado las reglas entre versiones, pero no conozco el historial allí.
Le sugiero que no se preocupe por diferencias tan pequeñas en el formato localizado. Pero si insistes, tendrás que:
Locale de la que depende su código, ya sea implícita o explícitamente.Locale .prueba esto
val currentTime = SimpleDateFormat("hh:mm a", Locale.getDefault()).format(Date())