Rumah  >  Artikel  >  Java  >  Mengapa Sukar untuk Menghuraikan Rentetan ISO 8601 dalam Java 8 Apabila Offset Kekurangan Titik Bertitik?

Mengapa Sukar untuk Menghuraikan Rentetan ISO 8601 dalam Java 8 Apabila Offset Kekurangan Titik Bertitik?

Susan Sarandon
Susan Sarandonasal
2024-10-31 02:37:29262semak imbas

Why Is It Difficult to Parse ISO 8601 Strings in Java 8 When the Offset Lacks a Colon?

Kesukaran Menghuraikan Rentetan ISO 8601 dalam Java 8: Kolon Hilang dalam Offset

Fungsi penghuraian tarikh dan masa Java boleh mengecewakan, terutamanya apabila berurusan dengan rentetan berformat ISO 8601 yang tidak mempunyai titik bertindih dalam offset. Mari kita teroka isu ini dan sediakan penyelesaian menggunakan API java.time baharu.

Penerangan Masalah:

Apabila cuba menghuraikan rentetan tarikh seperti "2018-02-13T10 :20:12.120 0000" menggunakan kelas java.util.Date warisan, proses ini berjaya dengan lancar.

Date date = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss.SSSZZZ")
                      .parse("2018-02-13T10:20:12.120+0000");

Walau bagaimanapun, format yang sama gagal apabila menggunakan kelas ZonedDateTime yang lebih baharu daripada java.time.

ZonedDateTime dateTime = ZonedDateTime.parse("2018-02-13T10:20:12.120+0000",
                   DateTimeFormatter.ofPattern("yyyy-MM-dd'T'hh:mm:ss.SSSZZZ"));

Penyelesaian:

Masalahnya terletak pada penggunaan kelas yang salah untuk menghurai. Daripada ZonedDateTime, yang mewakili zon masa sepenuh masa, anda harus menggunakan OffsetDateTime untuk kes yang melibatkan hanya offset daripada UTC.

OffsetDateTime odt = OffsetDateTime.parse( 
    "2018-02-13T10:20:12.120+0000" , 
    DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSX" )
);

Penyelesaian Pepijat Sementara:

Malangnya , disebabkan pepijat dalam Java 8, anda mungkin menghadapi masalah semasa menghuraikan rentetan mengimbangi yang menghilangkan titik bertindih antara jam dan minit. Sebagai penyelesaian, anda boleh melakukan salah satu daripada yang berikut:

  1. Godam: Gantikan titik bertindih yang hilang dalam rentetan input.

    String input = "2018-02-13T10:20:12.120+0000".replace( "+0000" , "+00:00" );
  2. Tentukan Corak Pemformatan: Gunakan corak pemformatan yang jelas semasa membina DateTimeFormatter.

    String input = "2018-02-13T10:20:12.120+0000" ;
    DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu-MM-dd'T'HH:mm:ss.SSSX" );

Pertimbangan Tambahan:

Jika anda memerlukan nilai dalam UTC, ekstrak objek Segera. Untuk masa setempat, gunakan zon waktu menggunakan kelas ZonedDateTime.

Kesimpulan:

Dengan memahami kelas yang sesuai dan mengendalikan pepijat, anda boleh menghuraikan dan memanipulasi tarikh dengan berkesan dalam format ISO 8601 menggunakan API java.time. Ingatlah untuk menggunakan kelas yang lebih baharu apabila mungkin untuk mengelakkan isu pemformatan tarikh lama.

Atas ialah kandungan terperinci Mengapa Sukar untuk Menghuraikan Rentetan ISO 8601 dalam Java 8 Apabila Offset Kekurangan Titik Bertitik?. 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