web-dev-qa-db-ja.com

JDK8:LocalTimeを解析できません

StringLocalDateオブジェクトに解析できました:

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

何が悪いのですか?

18
Luigi Cortese

[〜#〜] api [〜#〜] に従って特定の形式を使用する場合:

文字列は有効な時間を表す必要があり、 DateTimeFormatter.ISO_LOCAL_TIME を使用して解析されます。

hh mm 

24時間は

HH mm

または12時間

kk mm

処理される形式には、次の条件が必要です。

  • 時間の2桁。 2桁になるように、事前にゼロが埋め込まれています。
  • コロン
  • 分を表す2桁の数字。 2桁になるように、事前にゼロが埋め込まれています。
  • 秒が利用できない場合、フォーマットは完了です。
  • コロン
  • 秒の2桁。 2桁になるように、事前にゼロが埋め込まれています。
  • Nano-of-secondがゼロまたは使用できない場合、フォーマットは完了です。
  • 小数点
  • ナノ秒の1から9桁。必要な数の桁が出力されます。
20
Jordi Castilla

この場合、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つが含まれている必要があります。

3
Alex Taylor

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);
3
walkeros

パターンで大文字の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
1
dogant