Apabila cuba menghuraikan rentetan berformat ISO 8601- ("2018- 02-13T10:20:12.120 0000") menggunakan kelas ZonedDateTime Java 8 dan corak format yang telah ditetapkan, pengguna mungkin menghadapi ralat penghuraian disebabkan titik bertindih yang hilang dalam offset.
Isu penghuraian ini berpunca daripada pepijat dalam Java 8 yang menghalang kelas OffsetDateTime daripada menghuraikan offset dengan betul tanpa tanda titik antara jam dan minit. Pepijat ini menjejaskan offset seperti " 0000" tetapi bukan " 00:00".
Ubah rentetan input untuk menambah titik bertindih yang hilang sebelum menghuraikan:
<code class="java">String input = "2018-02-13T10:20:12.120+0000".replace("+0000", "+00:00"); OffsetDateTime odt = OffsetDateTime.parse(input);</code>
Tentukan DateTimeFormatter dengan corak khusus untuk membimbing penghuraian:
<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>
Untuk lebih corak pemformatan yang boleh disesuaikan, gunakan 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>
Untuk memudahkan penghuraian, pastikan offset sentiasa mengandungi titik bertindih, sertakan kedua-dua jam dan minit (walaupun sifar), dan gunakan sifar padding (-05:00 bukannya -5).
<code class="java">Instant instant = odt.toInstant();</code>
<code class="java">ZoneId z = ZoneId.of("America/Montreal"); ZonedDateTime zdt = odt.atZoneSameInstant(z);</code>
Atas ialah kandungan terperinci Mengapakah kelas OffsetDateTime Java 8 bergelut untuk menghuraikan rentetan ISO 8601 dengan offset seperti \" 0000\"?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!