Rumah >Java >javaTutorial >Bolehkah Java.time Menghuraikan Pecahan Sesaat dengan Tepat?
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:
<code class="java">SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSS"); Date d = sdf.parse(input);</code>
<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>
<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!