ホームページ >Java >&#&チュートリアル >Java.time は秒の小数部分を正確に解析できますか?

Java.time は秒の小数部分を正確に解析できますか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-10-28 16:08:02196ブラウズ

 Can Java.time Parse Fractions of a Second Accurately?

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 の制限により、代替ソリューションが存在します:

  • SimpleDateFormat (注意事項あり):
<code class="java">SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSS");
Date d = sdf.parse(input);</code>
  • サードパーティ ライブラリ (例: 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>
  • 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>

以上がJava.time は秒の小数部分を正確に解析できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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