Rumah  >  Artikel  >  Java  >  Bolehkah Java.time Menghuraikan Pecahan Sesaat dengan Tepat?

Bolehkah Java.time Menghuraikan Pecahan Sesaat dengan Tepat?

Linda Hamilton
Linda Hamiltonasal
2024-10-28 16:08:02124semak imbas

 Can Java.time Parse Fractions of a Second Accurately?

Bolehkah java.time Mengendalikan Fraction-of-Second Parsing?

Garis Isu:

Dalam Java 8, percubaan untuk menghuraikan pecahan-saat menggunakan pakej java.time pada mulanya membuahkan kejayaan tetapi kemudiannya menemui pengecualian. Kegagalan ini berterusan walaupun apabila memasukkan "SS" dalam corak pemformatan untuk milisaat. Walaupun dokumentasi menunjukkan keperluan untuk bilangan aksara format yang sama seperti digit input, penguatkuasaan mod yang ketat menyalahtafsirkan kekurangan aksara pecahan.

Penyelesaian:

Isu ini telah diselesaikan diselesaikan dalam Java 9. Sehingga itu, penyelesaian yang melibatkan penghuraian nilai bersebelahan tersedia:

<code class="java">DateTimeFormatter dtf = new DateTimeFormatterBuilder()
  .appendPattern("yyyyMMddHHmmss")
  .appendValue(ChronoField.MILLI_OF_SECOND, 3)
  .toFormatter();</code>

Walau bagaimanapun, pendekatan ini tidak mengendalikan contoh khusus dua digit pecahan dalam SS.

Latar Belakang Teknikal:

Simbol corak "S" mewakili mana-mana pecahan saat, termasuk nanosaat. Penghuraian nilai bersebelahan membolehkan penghurai menghuraikan medan yang dipisahkan oleh literal atau pemisah bahagian masa.

Penyelesaian Alternatif:

Disebabkan pengehadan JSR-310 dalam mengurus penghuraian nilai bersebelahan, penyelesaian alternatif wujud:

  • SimpleDateFormat (dengan kaveat):
<code class="java">SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSS");
Date d = sdf.parse(input);</code>
  • Perpustakaan pihak ketiga (mis., Joda-Time, Time4J):
<code class="java">// Joda-Time
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyyMMddHHmmssSS");</code>
<code class="java">// Time4J
ChronoFormatter<PlainTimestamp> f = ChronoFormatter.ofTimestampPattern("yyyyMMddHHmmssSS", PatternType.CLDR, Locale.ROOT);</code>
  • Godam DIY:
<code class="java">String input = "2011120312345655";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
int len = input.length();
LocalDateTime ldt = LocalDateTime.parse(input.substring(0, len - 2), dtf);
int millis = Integer.parseInt(input.substring(len - 2)) * 10;
ldt = ldt.plus(millis, ChronoUnit.MILLIS);</code>

Atas ialah kandungan terperinci Bolehkah Java.time Menghuraikan Pecahan Sesaat dengan Tepat?. 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