Home > Java > javaTutorial > body text

Why is Java 8\'s OffsetDateTime class struggling to parse ISO 8601 strings with offsets like \' 0000\'?

Barbara Streisand
Release: 2024-10-31 07:10:01
Original
385 people have browsed it

Why is Java 8's OffsetDateTime class struggling to parse ISO 8601 strings with offsets like

Difficulties Parsing ISO 8601 Strings with Java 8 Date API

When attempting to parse an ISO 8601-formatted string ("2018-02-13T10:20:12.120 0000") using Java 8's ZonedDateTime class and a pre-defined format pattern, users may encounter a parsing error due to a missing colon in the offset.

The Culprit: A Java 8 Bug

This parsing issue stems from a bug in Java 8 that prevents the OffsetDateTime class from correctly parsing offsets without a colon between the hours and minutes. This bug affects offsets like " 0000" but not " 00:00".

Workarounds Until the Bug is Fixed:

(a) String Manipulation Hack:

Alter the input string to add the missing colon before parsing:

<code class="java">String input = "2018-02-13T10:20:12.120+0000".replace("+0000", "+00:00");
OffsetDateTime odt = OffsetDateTime.parse(input);</code>
Copy after login

(b) Explicit DateTimeFormatter:

Define a DateTimeFormatter with a specific pattern to guide the parsing:

<code class="java">String input = "2018-02-13T10:20:12.120+0000";
DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX");
OffsetDateTime odt = OffsetDateTime.parse(input, f);</code>
Copy after login

Further Enhancements:

For a more adaptable formatting pattern, utilize a DateTimeFormatterBuilder:

<code class="java">DateTimeFormatter f = DateTimeFormatterBuilder.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSX")
                                         .appendOffset("+HH:MM", "Z")
                                         .toFormatter();
OffsetDateTime odt = OffsetDateTime.parse(input, f);</code>
Copy after login

Recommendation:

To simplify parsing, ensure that offsets always include a colon, include both hours and minutes (even if zero), and use padding zeros (-05:00 instead of -5).

Additional Notes:

  1. For values in UTC, use Instant:
<code class="java">Instant instant = odt.toInstant();</code>
Copy after login
  1. To obtain a specific time zone's wall-clock representation:
<code class="java">ZoneId z = ZoneId.of("America/Montreal");
ZonedDateTime zdt = odt.atZoneSameInstant(z);</code>
Copy after login
  1. Avoid legacy date-time classes; use java.time instead.

The above is the detailed content of Why is Java 8\'s OffsetDateTime class struggling to parse ISO 8601 strings with offsets like \' 0000\'?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!