【问题标题】:How do I format am-pm-of-day to be "AM/PM" rather than "a.m./p.m."?如何将 am-pm-of-day 格式设置为“AM/PM”而不是“a.m./p.m.”?
【发布时间】:2022-01-10 23:51:00
【问题描述】:

DateTimeFormatter's API reference 似乎错过了正确格式化 am-pm-of-day 的细节,我总是可以使用 String.replace() 但我觉得将 a.m. 更改为 AM 和/或 p.m. 的选项更有意义。使用“aaa ...”发送给 PM。有没有办法做到这一点?

【问题讨论】:

  • 格式是本地化的,改了可能没意义
  • @MadProgrammer 不太清楚这意味着什么,但在这种情况下,why is the example "PM"?
  • 我的意思是 - 并非每种语言/本地化都使用 ampm(或它们的变体),因此尝试更改它可能没有意义,因为它可能会产生不利影响在不同的本地化中使用时

标签: java java-8 java-time


【解决方案1】:

根据 CLDR 本地化

在格式化日期时间对象的文本表示时,关于大小写和缩写的决定由本地化规则决定。这些规则被定义为Locale 对象的一部分。在基于 OpenJDK 项目代码库的最新 Java 版本中,Locale 类从 Unicode 联盟维护的 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 以及 LocaleDateTimeFormatter 类都支持亚文化。如果更高级别的文化不符合您的期望,请探索 CLDR 的定义。其中一种亚文化可能持有您想要的本地化规则的选择。

【讨论】:

  • 给出的示例是“PM”而不是“p.m.”的任何原因?
  • @imashnake_ JavaDoc 使用任意选择的示例。很可能这个例子就是那天技术作家头脑中突然出现的任何东西。物以类聚,人以群分。一些文化使用一种格式,另一些文化使用另一种格式。两者都不是正确的,也不是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2011-07-16
  • 1970-01-01
  • 2012-06-05
  • 2020-09-09
  • 1970-01-01
相关资源
最近更新 更多