ホームページ >Java >&#&チュートリアル >Java.time は秒の小数部分を正確に解析できますか?
Java.time は秒の小数部分の解析を処理できますか?
問題の概要:
Java 8 では、java.time パッケージを使用して秒の小数部分を解析しようとすると、最初は成功しましたが、後で例外が発生しました。この障害は、ミリ秒単位のフォーマット パターンに「SS」を組み込んだ場合でも発生しました。ドキュメントでは入力数字と同じ数のフォーマット文字が必要であることが示されているにもかかわらず、厳密モードの適用では小数文字が欠落していると誤解されていました。
解決策:
この問題は解決済みです。 Java 9 で解決されました。それまでは、隣接する値の解析を伴う回避策が利用可能です:
<code class="java">DateTimeFormatter dtf = new DateTimeFormatterBuilder() .appendPattern("yyyyMMddHHmmss") .appendValue(ChronoField.MILLI_OF_SECOND, 3) .toFormatter();</code>
ただし、このアプローチでは SS 内の 2 つの小数桁の特定のインスタンスは処理されません。
技術的背景:
パターン記号「S」は、ナノ秒を含む秒の小数部分を表します。隣接値解析により、パーサーはリテラルまたは時刻部分区切り文字で区切られたフィールドを区切ることができます。
代替ソリューション:
隣接値解析の管理における JSR-310 の制限により、代替ソリューションが存在します:
<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>
以上がJava.time は秒の小数部分を正確に解析できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。