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

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

在第 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
…

关于java - DateTimeFormatter - java.lang.IllegalArgumentException : Too many pattern letters: a,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71753710/

相关文章:

php - 时间如何储存

java - 从另一个可观察对象调用可观察对象

Java - ImageIO.write 的加载文件在 .jar 中不起作用

xslt - XSL日期格式问题

r - 帮助解释/转换奇数日期格式

java - 在 Java8 Date API 中将持续时间转换为年?

java - 如何从内部识别 Java Web 应用程序的 URL?

Java 程序无法在 Solaris 上使用 ftp。

java - DateTimeFormatter 和 SimpleDateFormat 产生不同的字符串

java-8 - Java8 向 LocalDateTime 添加小时不工作