web-dev-qa-db-ja.com

nanoSecondsあり/なしの文字列からLocalDateへの変換

文字列にnanoOfSecondsがあるかどうかにかかわらず、文字列をLocalTime(jodaではなくJava-8)に変換する必要があります。文字列の形式は07:06:05または07:06:05.123456の形式です。文字列は秒の小数点以下の桁数がある場合とない場合があり、その場合、ナノ秒部分を表す文字がいくつあってもかまいません。

次のようなDateTimeForamtterの使用

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss");

または

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss.SSSSSS");

IFステートメントを使用して、次のような2つの形式を区別できます。

DateTimeFormatter dtf;
if (time1.contains(".") {
   dtf = DateTimeFormatter.ofPattern("H:mm:ss.SSSSSS);
} else {
   dtf = DateTimeFormatter.ofPattern("H:mm:ss);
}

これは問題なく機能し、私はこれで問題ありませんが、小数点以下のさまざまな桁数も使用できるようにする必要があります。

サンプルデータセットは次のようになります。

[11:07:59.68750, 11:08:00.781250, 11:08:00.773437500, 11:08:01]

フォーマッターが小数点以下の桁数が不明なときにJava.time.format.DateTimeParseExceptionをスローせずに、小数点以下の桁数を解析できるようにする方法はありますか?

本当にシンプルなものが足りないことを願っています。

12
jbolt

このフォーマットを解析するために特別なことをする必要はありません。 LocalTime.parse(String)はすでにオプションのナノ秒を処理しています:

System.out.println(LocalTime.parse("10:15:30"));
System.out.println(LocalTime.parse("10:15:30."));
System.out.println(LocalTime.parse("10:15:30.1"));
System.out.println(LocalTime.parse("10:15:30.12"));
System.out.println(LocalTime.parse("10:15:30.123456789"));

上記のすべてがうまく解析されます。 Javadocspec も参照してください。

29
JodaStephen

これには、フォーマットパターンの「オプションセクション」を使用できます。

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("H:mm:ss[.SSSSSS]");
8
Jon Skeet