如何将 am-pm-of-day 格式化为 "AM/PM" 而不是 "a.m./p.m."?

How do I format am-pm-of-day to be "AM/PM" rather than "a.m./p.m."?

DateTimeFormatter's API reference 似乎错过了正确格式化上午下午的详细信息,我总是可以使用 String.replace() 但我觉得更改选项更有意义 a.m.上午 and/or p.m。 PM 使用“aaa...”。有办法吗?

根据 CLDR 本地化

在格式化日期时间对象的文本表示时,有关大小写和缩写的决定留给本地化规则处理。这些规则被定义为由 Unicode 联盟维护的 Locale object. In the latest versions of Java built on the codebase of the OpenJDK project, the Locale class gets its localization data from the Common Locale Data Repository (CLDR) 的一部分。

所以不,没有办法指定使用“AM”还是“a.m”。除了指定一个 Locale 对象与另一个对象。

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) ) ;

如果您坚持使用特定格式,则必须自己进行字符串操作。但我建议让 LocaleDateTimeFormatter 和 CLDR 完成本地化工作,而不是硬编码琐碎的格式调整。

注意 CLDR,因此 Locale & DateTimeFormatter 类 支持亚文化。如果更高层次的文化不符合您的期望,请探索 CLDR 的定义。一种亚文化可能会保留您想要的本地化规则选择。