ホームページ  >  記事  >  Java  >  Java 8 の「java.time」パッケージが厳密モードで秒の小数部分の値を解析できないのはなぜですか?

Java 8 の「java.time」パッケージが厳密モードで秒の小数部分の値を解析できないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-02 00:35:31498ブラウズ

Why Does Java 8's `java.time` Package Fail to Parse Fraction-of-Second Values in Strict Mode?

java.time は秒の小数部の解析に失敗しますか?

Java 8 の初期リリースでは、java.time を使用して秒の小数点を解析します。パッケージで例外が発生する可能性があります。次のコードを考えてみましょう:

<code class="java">String input = "2011120312345655";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSS");
LocalDateTime localDateTime = LocalDateTime.parse(input, formatter);</code>

このコードは例外で失敗します:

java.time.format.DateTimeParseException

ドキュメントには、厳密モードでは入力桁と同じ数のフォーマット文字が必要であると記載されています。ただし、コードには秒の小数部を表す「SS」が含まれており、入力の桁数と矛盾しています。

この問題に対処するために、次の回避策が提案されました。

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

ただし、この回避策は、「S」パターン シンボルが 2 つだけの使用例を完全にカバーしているわけではありません。 MICRO_OF_SECOND (6 SSSSSS) や NANO_OF_SECOND (9 SSSSSSSSS) などの他のフィールドを使用する必要があります。

ドキュメントによると、

「小数: ナノ秒フィールドを小数として出力します。 (...) 厳密モードで解析する場合、解析される桁数はパターン文字の数と一致する必要があります。"

これは、「S」がミリ秒だけでなく秒の小数部を表すことを意味します。 .

Java 9 での解決策

Java 9 では、この問題は解決されました。 Java 8 の初期リリースでは、小数部分の隣接値解析を実装する際に課題が発生しました。この制限により、明確な境界なしで複数のフィールドにまたがるテキスト内のフィールドの解釈が妨げられました。

しかし、Java 9 では、JSR-310 パーサーは隣接する値の解析で小数部分を解析する機能を獲得しました。この改善により、以前のバージョンで直面した課題が解決され、秒の小数部分の値を操作する際の柔軟性が強化されました。

以上がJava 8 の「java.time」パッケージが厳密モードで秒の小数部分の値を解析できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。