SimpleDateFormat Parsing Date with 'Z' Literal
When attempting to parse a date in ISO 8601 format using SimpleDateFormat, it may fail to correctly handle the 'Z' literal, which denotes UTC as the preferred reference point. For instance, parsing the string "2010-04-05T17:16:00Z" using the pattern "yyyy-MM-dd'T'HH:mm:ss" will result in an incorrect local time.
The traditional patterns "yyyy-MM-dd'T'HH:mm:ssz" and "yyyy-MM-dd'T'HH:mm:ssZ" are also insufficient for parsing dates with the 'Z' literal. This behavior may seem counterintuitive since the 'Z' literal explicitly indicates UTC.
Solution
Prior to Java 7, parsing dates with the 'Z' literal required explicitly setting the TimeZone on the SimpleDateFormat object. However, in Java 7 and above, the pattern "yyyy-MM-dd'T'HH:mm:ssX" can be utilized to correctly parse and apply the UTC timezone suffix.
For example:
<code class="java">SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX"); Date date = sdf.parse("2010-04-05T17:16:00Z");</code>
This will parse the date correctly as a UTC time.
Alternative
Another alternative is to use the java.time package introduced in Java 8, which provides a more modern and comprehensive date and time API. The following code demonstrates using java.time to parse the date:
<code class="java">import java.time.Instant; import java.time.ZonedDateTime; String dateString = "2010-04-05T17:16:00Z"; Instant instant = Instant.parse(dateString); ZonedDateTime zonedDateTime = instant.atZone(ZoneId.of("Z"));</code>
This approach eliminates the need for complex patterns or explicit timezone setting, as java.time natively handles UTC time zones.
The above is the detailed content of How to Correctly Parse Dates with \'Z\' Literal in Java using SimpleDateFormat?. For more information, please follow other related articles on the PHP Chinese website!