I have the following line in my java
code where I am trying to format a date string
ZonedDateTime zonedDateTime= ZonedDateTime.ofInstant(instant, tz);
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm aa");
return zonedDateTime.format(formatter);
At line 2 , I am getting this error:
java.lang.IllegalArgumentException: Too many pattern letters: a
at java.time.format.DateTimeFormatterBuilder.parseField(DateTimeFormatterBuilder.java:1774)
How can I create a format string for DateTimeFormatter.ofPattern
that will give e.g:
2023-04-21 7.00pm
a
As the error describes, you have used too many a
character codes.
👉 Change aa
to a
.
You may have been thinking of two letters for AM and PM. But actually, other text might appear instead.
The text generated by a
depends on the human language and cultural norms used during localization. You specify the language and norms by way of a Locale
. If omitted, your JVM’s current default locale is implicitly applied.
For fun, let’s try looking at all possible outputs across all locales.
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 ) ;
}
See this code run live at IdeOne.com.
You can see that many different pieces of text are possible, many are more than two characters. Even those using PM
or pm
may have more than two characters when including FULL STOP character: 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
…