JDK8:无法解析LocalTime

时间:2015-06-10 10:55:48

标签: java java-8 date-parsing

我设法将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

我做错了什么?

4 个答案:

答案 0 :(得分:18)

如果您使用特定格式,请参阅API

  

字符串必须表示有效时间,并使用DateTimeFormatter.ISO_LOCAL_TIME进行解析。

hh mm 

24小时必须

HH mm

或12小时

kk mm

处理的格式必须具备以下条件:

  • 每小时的两位数字。这是预先填充零以确保两位数。
  • 冒号
  • 分钟的两位数字。这是预先填充零以确保两位数。
  • 如果第二分钟不可用,则表示格式已完成。
  • 冒号
  • 第二分钟的两位数字。这是预先填充零以确保两位数。
  • 如果纳秒级为零或不可用,则表示格式已完成。
  • 小数点
  • 纳秒级的一到九位数。根据需要输出许多数字。

答案 1 :(得分:3)

使用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);

答案 2 :(得分:3)

在这种情况下Unable to obtain LocalTime from TemporalAccessor意味着它无法确定给定字符串表示的一天中有多远,即没有足够的信息来构造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文档说

  

转换使用TemporalQueries.localTime()查询   依赖于提取NANO_OF_DAY字段。

您的错误告诉您TemporalAccessor只有两个字段,两个字段都不是NANO_OF_DAY字段。使用LocalTime检索DateTimeFormatter的最小允许模式为:

DateTimeFormatter.ofPattern("ha");
DateTimeFormatter.ofPattern("Ka");
DateTimeFormatter.ofPattern("ah");
DateTimeFormatter.ofPattern("aK");
DateTimeFormatter.ofPattern("k");
DateTimeFormatter.ofPattern("H");

您的模式必须至少包含其中一个字符串,才能在内部NANO_OF_DAY中获得TemporalAccessor字段,从中可以构建LocalTime

答案 3 :(得分:1)

您需要在模式中使用大写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