La referencia de API de DateTimeFormatter parece perder detalles para formatear am-pm-of-day correctamente, siempre podría usar String.replace() pero creo que tiene más sentido tener una opción para cambiar am a AM y/o pm a MP usando "aaa...". ¿Hay alguna forma de hacer esto?
Al dar formato a la representación textual de un objeto de fecha y hora, las decisiones sobre mayúsculas y abreviaturas se dejan a las reglas de localización. Esas reglas se definen como parte de un objeto Locale . En las últimas versiones de Java basadas en el código base del proyecto OpenJDK, la clase Locale obtiene sus datos de localización delRepositorio de datos de configuración regional común (CLDR) mantenido por Unicode Consortium.
Así que no, no hay forma de especificar el uso de "AM" versus "am" que no sea especificar un objeto Locale versus otro.
ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "Asia/Tokyo" ) ) ; DateTimeFormatter f = DateTimeFormatter.ofLocalizedTime( FormatStyle.MEDIUM ) ; String outputCaFr = zdt.format( f.withLocale( Locale.CANADA_FRENCH ) ) ; String outputUkEn = zdt.format( f.withLocale( Locale.UK) ) ; Si insiste en un formato particular, tendrá que manipular la cadena usted mismo. Pero sugiero dejar que Locale , DateTimeFormatter y CLDR hagan su trabajo de localización en lugar de codificar los ajustes de formato triviales.
Tenga en cuenta que CLDR y, por lo tanto, las clases Locale y DateTimeFormatter admiten subculturas. Explore las definiciones de CLDR si la cultura de alto nivel no cumple con sus expectativas. Una de las subculturas puede contener la elección de las reglas de localización que desee.