This question already has an answer here:
I am trying to parse a date that looks like this:
2010-04-05T17:16:00Z
This is a valid date per http://www.ietf.org/rfc/rfc3339.txt. The 'Z' literal "imply that UTC is the preferred reference point for the specified time."
If I try to parse it using SimpleDateFormat and this pattern:
yyyy-MM-dd'T'HH:mm:ss
It will be parsed as a Mon Apr 05 17:16:00 EDT 2010
SimpleDateFormat is unable to parse the string with these patterns:
yyyy-MM-dd'T'HH:mm:ssz
yyyy-MM-dd'T'HH:mm:ssZ
I can explicitly set the TimeZone to use on the SimpleDateFormat to get the expected output, but I don't think that should be necessary. Is there something I am missing? Is there an alternative date parser?
The date you are parsing is in ISO8601 format.
In java 7 the pattern to read and apply the timezone suffix should read
yyyy-MM-dd'T'HH:mm:ssX
In the pattern, the inclusion of a 'z' date-time component indicates that timezone format needs to conform to the General time zone "standard", examples of which are
Pacific Standard Time; PST; GMT-08:00
.A 'Z' indicates that the timezone conforms to the RFC 822 time zone standard, e.g.
-0800
.I think you need a DatatypeConverter ...
Under Java 8 use the predefined DateTimeFormatter.ISO_DATE_TIME
I guess its the easiest way
Java doesn't parse ISO dates correctly.
Similar to McKenzie's answer.
Just fix the
Z
before parsing.Code
Result
The 'X' only works if partial seconds are not present: i.e. SimpleDateFormat pattern of
"yyyy-MM-dd'T'HH:mm:ssX"
Will correctly parse
"2008-01-31T00:00:00Z"
but
"yyyy-MM-dd'T'HH:mm:ss.SX"
Will NOT parse
"2008-01-31T00:00:00.000Z"
Sad but true, a date-time with partial seconds does not appear to be a valid ISO date: http://en.wikipedia.org/wiki/ISO_8601
The time zone should be something like "GMT+00:00" or 0000 in order to be properly parsed by the SimpleDateFormat - you can replace Z with this construction.