Rumah >Java >javaTutorial >Mengapakah kelas OffsetDateTime Java 8 bergelut untuk menghuraikan rentetan ISO 8601 dengan offset seperti \' 0000\'?

Mengapakah kelas OffsetDateTime Java 8 bergelut untuk menghuraikan rentetan ISO 8601 dengan offset seperti \' 0000\'?

Barbara Streisand
Barbara Streisandasal
2024-10-31 07:10:01483semak imbas

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

Kesukaran Menghuraikan Rentetan ISO 8601 dengan Java 8 Date API

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.

The Culprit : Pepijat Java 8

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".

Penyelesaian Sehingga Pepijat Dibetulkan:

(a ) Peretasan Manipulasi Rentetan:

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>

(b) Explicit DateTimeFormatter:

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>

Penambahan Selanjutnya:

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>

Cadangan:

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).

Nota Tambahan:

  1. Untuk nilai dalam UTC, gunakan Segera:
<code class="java">Instant instant = odt.toInstant();</code>
  1. Untuk mendapatkan perwakilan jam dinding zon waktu tertentu:
<code class="java">ZoneId z = ZoneId.of("America/Montreal");
ZonedDateTime zdt = odt.atZoneSameInstant(z);</code>
  1. Elakkan warisan kelas tarikh-masa; gunakan java.time sebaliknya.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn