我目前正在将一个软件从 Java 11 迁移到 Java 17,并注意到
DateTimeFormatter
在格式化包含 AM/PM 标记的时间时改变了其行为。早些时候,该标记已经本地化(例如,德语中的 vorm.
表示 AM),而现在,它仍然是 AM。这不是特定于语言环境的问题,因为我已经在其他语言环境中尝试过此操作。这里尝试的模式是 HH:mm:ss a
,其中 a
是标记的占位符。如何才能恢复之前的行为?
使用
DateTimeFormatter
方法调用 ofPattern
,如下所示:
ofPattern("HH:mm:ss a", Locale.GERMANY).format(now)
。
变量 now
是一个 LocalDateTime 对象。
我也有同样的问题。 我找到了这个: https://bugs.openjdk.org/browse/JDK-8297504
基本上,在 java 11 所基于的较旧的 unicode CLDR (v33) 中,AM/PM 的德语术语是 nachm。和沃尔姆。
但是在 java17 所基于的 CLDR v44 中,他们将其更改为 AM/PM。
所以当前基于最新unicode的德语正确方式是AM/PM
使用正确的
Chronology
和 Locale
创建正确的日期时间格式将在所需的区域设置中给出 am/pm。对于德国和中文,我能够获得正确的数据,但对于印地语和意大利,它没有给出预期的输出。可能这就是数据在各自区域的显示方式。
final String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(FormatStyle.FULL, FormatStyle.FULL, Chronology.ofLocale(Locale.GERMAN),Locale.GERMAN);
final DateTimeFormatter targetFormat = DateTimeFormatter.ofPattern(pattern).withLocale(Locale.GERMAN);
final String value = ZonedDateTime.now().format(targetFormat);