问题
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'
回答1:
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 regarding x
and X
, I'll go ahead and state here that right now, it says X
(uppercase) is supported (since API level 1), but x
(lowercase) is not mentioned at all. The docs used to not mention X
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 that X
has been supported since API level 1. This explains why you're getting the IllegalArgumentException: 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's IllegalArgumentException
was due to testing the app on a pre-24 device, since the docs didn't say anything about supported API levels before.
回答2:
I believe I found the answer in an issue at GitHub:
You are right, Android uses
ZZZZZ
instead to generate time zone like+01:00
(likeXXX
in Java). For now, could you try using theApiClient#setDatetimeFormat
method to customize the datetime format to make it work in Android?Taking the petstore sample as an example:
// import io.swagger.client.Configuration; // import io.swagger.client.ApiClient; // import java.text.SimpleDateFormat; // Customize for the default ApiClient Configuration.getDefaultApiClient().setDatetimeFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ")); // Customize for a new ApiClient ApiClient apiClient = new ApiClient(); apiClient.setDatetimeFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ")); // Use the new ApiClient PetApi api = new PetApi(apiClient); api.getPetById(new Long(1));
Apparently, I have to use:
yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ
回答3:
The pattern you need is "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"
and yet it mentions a lowercase x
in the exception. Looks like you have a typo somewhere.
回答4:
Use this instead:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZZZZZ");
回答5:
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
来源:https://stackoverflow.com/questions/44588429/unknown-pattern-character-x-when-using-simpledateformat