Im trying to format a Date
to String
using SimpleDateFormat
, and the pattern im using is this one
"yyyy-MM-dd'T'HH:mm:ss.SSSxxx"
but when reach this line
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSxxx");
i get the following exception:
java.lang.IllegalArgumentException: Unknown pattern character 'x' at java.text.SimpleDateFormat.validatePatternCharacter(SimpleDateFormat.java:323) at java.text.SimpleDateFormat.validatePattern(SimpleDateFormat.java:312) at java.text.SimpleDateFormat.(SimpleDateFormat.java:365) at java.text.SimpleDateFormat.(SimpleDateFormat.java:258)
the format im trying to achieve is "2017-06-16T12:19:59.001+02:00"
according to the documentation this pattern should work Whats wrong?
EDIT To clarify, i tried with xxx and XXX
in case of XXX i get java.lang.IllegalArgumentException: Unknown pattern character 'X'
The pattern you need is
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX"
and yet it mentions a lowercasex
in the exception. Looks like you have a typo somewhere.i think you are looking for "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
Change date format to
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS"); or
DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
this may be help you
Use this instead:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ");
See Update below.
Unfortunately, regarding uppercase
X
, the documentation [was at the time of the question and this answer] wrong. Since the documentation seems to have changed significantly regardingx
andX
, I'll go ahead and state here that right now, it saysX
(uppercase) is supported (since API level 1), butx
(lowercase) is not mentioned at all. The docs used to not mentionX
either.A check of the Android source code (see validateFormat()) shows that only the letters
GyMdkHmsSEDFwWahKzZLc
are recognized in that version, despite the docs' claim thatX
has been supported since API level 1. This explains why you're getting theIllegalArgumentException: Unknown pattern character 'X'
.See this bug report for historical details.
Meanwhile, you'll have to find a workaround, which will vary depending on what kind of input you need to parse. E.g. the OP's answer.
Update: X is available only from Nougat+.
The documentation has now been fixed to add a "Supported (API Levels)" column, which indicates that
X
is only supported starting from API level 24. Presumably the OP'sIllegalArgumentException
was due to testing the app on a pre-24 device, since the docs didn't say anything about supported API levels before.I believe I found the answer in an issue at GitHub:
Apparently, I have to use: