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

Mary-Kate Olsen
リリース: 2024-11-02 00:35:31
オリジナル
508 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!