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:
Godam: Gantikan titik bertindih yang hilang dalam rentetan input.
String input = "2018-02-13T10:20:12.120+0000".replace( "+0000" , "+00:00" );
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!