String
をLocalDate
オブジェクトに解析できました:
DateTimeFormatter f1=DateTimeFormatter.ofPattern("dd MM yyyy");
LocalDate d=LocalDate.parse("26 08 1984",f1);
System.out.println(d); //prints "1984-08-26"
しかし、LocalTime
で同じことを行うことはできません。このコードの一部:
DateTimeFormatter f2=DateTimeFormatter.ofPattern("hh mm");
LocalTime t=LocalTime.parse("11 08",f2); //exception here
System.out.println(t);
DateTimeParseException
をスローします:
Exception in thread "main" Java.time.format.DateTimeParseException: Text '11 08' could not be parsed: Unable to obtain LocalTime from TemporalAccessor: {MinuteOfHour=8, HourOfAmPm=11},ISO of type Java.time.format.Parsed
at Java.time.format.DateTimeFormatter.createError(Unknown Source)
at Java.time.format.DateTimeFormatter.parse(Unknown Source)
at Java.time.LocalTime.parse(Unknown Source)
at com.mui.cert.Main.<init>(Main.Java:21)
at com.mui.cert.Main.main(Main.Java:12)
Caused by: Java.time.DateTimeException: Unable to obtain LocalTime from TemporalAccessor: {MinuteOfHour=8, HourOfAmPm=11},ISO of type Java.time.format.Parsed
at Java.time.LocalTime.from(Unknown Source)
at Java.time.LocalTime$$Lambda$15/1854731462.queryFrom(Unknown Source)
at Java.time.format.Parsed.query(Unknown Source)
... 4 more
何が悪いのですか?
[〜#〜] api [〜#〜] に従って特定の形式を使用する場合:
文字列は有効な時間を表す必要があり、
DateTimeFormatter.ISO_LOCAL_TIME
を使用して解析されます。
hh mm
24時間は
HH mm
または12時間
kk mm
処理される形式には、次の条件が必要です。
この場合、Unable to obtain LocalTime from TemporalAccessor
は、指定された文字列が1日を通してどれだけ離れているかを判別できないことを意味します。つまり、LocalTime
を構築するための十分な情報がありません。舞台裏では、コードは次のようになりますJava 8バージョン(同様のエラーが発生します):
DateTimeFormatter f2 = DateTimeFormatter.ofPattern("hh mm");
TemporalAccessor temporalAccessor = f2.parse("11 08");
LocalTime t = temporalAccessor.query(LocalTime::from);
System.out.println(t);
LocalTime::from
のドキュメントには、
変換では、NANO_OF_DAYフィールドの抽出に依存するTemporalQueries.localTime()クエリを使用します。
エラーは、TemporalAccessor
には2つのフィールドしかなく、どちらもNANO_OF_DAY
フィールドでないことを示しています。 LocalTime
を使用してDateTimeFormatter
を取得するための最小許容パターンは次のとおりです。
DateTimeFormatter.ofPattern("ha");
DateTimeFormatter.ofPattern("Ka");
DateTimeFormatter.ofPattern("ah");
DateTimeFormatter.ofPattern("aK");
DateTimeFormatter.ofPattern("k");
DateTimeFormatter.ofPattern("H");
内部TemporalAccessor
からLocalTime
を構築できるNANO_OF_DAY
フィールドを取得するには、パターンにこれらの文字列の少なくとも1つが含まれている必要があります。
DateTimeFormatter.ofPattern("kk mm")
を使用します。 12時間時計の場合、またはDateTimeFormatter.ofPattern("HH mm")
24時間時計の場合
hh
で時間を解析する場合は、それをa
と組み合わせてAMまたはPMを定義する必要があります。
DateTimeFormatter f2 = DateTimeFormatter.ofPattern("hh mm a");
LocalTime t = LocalTime.parse("11 08 AM", f2);
パターンで大文字のHHを使用する必要があります
DateTimeFormatter f2=DateTimeFormatter.ofPattern("HH mm");
または、clock-hour-of-am-pm
指定する必要があります。
これも機能するはずです
DateTimeFormatter f2=DateTimeFormatter.ofPattern("hh mm a");
LocalTime t=LocalTime.parse("11 08 AM",f2); //exception here