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

jav*_*900 2 java date-format java-time zoneddatetime datetimeformatter

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

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

 return zonedDateTime.format(formatter);
Run Code Online (Sandbox Code Playgroud)

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

java.lang.IllegalArgumentException: Too many pattern letters: a
at java.time.format.DateTimeFormatterBuilder.parseField(DateTimeFormatterBuilder.java:1774)
Run Code Online (Sandbox Code Playgroud)

我如何创建一个格式字符串,DateTimeFormatter.ofPattern例如:

2023-04-21 7.00pm
Run Code Online (Sandbox Code Playgroud)

Bas*_*que 6

使用一个a

\n

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

\n

改成。aaa

\n

本土化

\n

您可能一直在考虑用两个字母来表示 AM 和 PM。但实际上,可能会出现其他文本。

\n

生成的文本a取决于本地化过程中使用的人类语言和文化规范。您可以通过 指定语言和规范Locale。如果省略,则隐式应用 JVM\xe2\x80\x99s 当前的默认区域设置。

\n

示例代码

\n

为了好玩,让\xe2\x80\x99s 尝试查看所有语言环境中的所有可能输出。

\n
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "h:mm a" ) ;\nLocalTime lt = LocalTime.of( 19 , 0 ) ;\nfor( Locale locale : Locale.getAvailableLocales() ) \n{\n    String s = lt.format( f.withLocale( locale ) ) ;\n    System.out.println( locale + " : " + s ) ;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

请参阅在 IdeOne.com 上实时运行的代码

\n

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

\n
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "h:mm a" ) ;\nLocalTime lt = LocalTime.of( 19 , 0 ) ;\nfor( Locale locale : Locale.getAvailableLocales() ) \n{\n    String s = lt.format( f.withLocale( locale ) ) ;\n    System.out.println( locale + " : " + s ) ;\n}\n
Run Code Online (Sandbox Code Playgroud)\n