DateTimeFormatter - java.lang.IllegalArgumentException:模式字母太多:a

DateTimeFormatter - java.lang.IllegalArgumentException: Too many pattern letters: a

我的 java 代码中有以下行,我在其中尝试格式化日期字符串

 ZonedDateTime zonedDateTime= ZonedDateTime.ofInstant(instant, tz);
 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm aa");

 return zonedDateTime.format(formatter);

在第 2 行,我收到此错误:

java.lang.IllegalArgumentException: Too many pattern letters: a
at java.time.format.DateTimeFormatterBuilder.parseField(DateTimeFormatterBuilder.java:1774)

如何为 DateTimeFormatter.ofPattern 创建格式字符串,例如:

2023-04-21 7.00pm

使用一个a

如错误所述,您使用了太多 a 个字符代码。

aa 更改为 a

本地化

您可能一直在想上午和下午这两个字母。但实际上,可能会出现其他文本。

a 生成的文本取决于本地化过程中使用的人类语言和文化规范。您通过 Locale 指定语言和规范。如果省略,则隐式应用 JVM 当前的默认语言环境。

示例代码

为了好玩,让我们尝试查看所有语言环境中所有可能的输出。

DateTimeFormatter f = DateTimeFormatter.ofPattern ( "h:mm a" ) ;
LocalTime lt = LocalTime.of( 19 , 0 ) ;
for( Locale locale : Locale.getAvailableLocales() ) 
{
    String s = lt.format( f.withLocale( locale ) ) ;
    System.out.println( locale + " : " + s ) ;
}

看到这个code run live at IdeOne.com

您可以看到可以有许多不同的文本片段,很多都超过两个字符。即使那些使用 PMpm 的人在包含句号时也可能有两个以上的字符:p.m..

nn : 7:00 ettermiddag
ar_JO : 7:00 م
bg : 7:00 сл.об.
kea : 7:00 pm
nds : 7:00 PM
zu : 7:00 PM
am_ET : 7:00 ከሰዓት
fr_DZ : 7:00 PM
ti_ET : 7:00 ድሕር ሰዓት
bo_CN : 7:00 ཕྱི་དྲོ་
hsb : 7:00 popołdnju
qu_EC : 7:00 p.m.
ta_SG : 7:00 பிற்பகல்
lv : 7:00 pēcpusdienā
en_NU : 7:00 PM
…