JDK8: 无法解析 LocalTime
JDK8: unable to parse LocalTime
我设法将 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/1854731462.queryFrom(Unknown Source)
at java.time.format.Parsed.query(Unknown Source)
... 4 more
我做错了什么?
你需要在模式中使用大写的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
使用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);
如果使用特定格式,根据API:
The string must represent a valid time and is parsed using DateTimeFormatter.ISO_LOCAL_TIME
.
hh mm
24 小时必须
HH mm
或 12 小时
kk mm
处理的格式必须满足以下条件:
- 一天中的小时数的两位数。这是用零预填充以确保两位数。
- 冒号
- 两位数表示小时。这是用零预填充以确保两位数。
- 如果秒数不可用,则格式完成。
- 冒号
- 秒的两位数。这是用零预填充以确保两位数。
- 如果纳秒为零或不可用,则格式完成。
- 一个小数点
- 纳秒的一到九位数字。将根据需要输出任意数量的数字。
在这种情况下,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
文档说
The conversion uses the TemporalQueries.localTime() query, which
relies on extracting the NANO_OF_DAY field.
您的错误告诉您 TemporalAccessor
只有两个字段,这两个字段都不是 NANO_OF_DAY
字段。使用 DateTimeFormatter
检索 LocalTime
的最小允许模式是:
DateTimeFormatter.ofPattern("ha");
DateTimeFormatter.ofPattern("Ka");
DateTimeFormatter.ofPattern("ah");
DateTimeFormatter.ofPattern("aK");
DateTimeFormatter.ofPattern("k");
DateTimeFormatter.ofPattern("H");
您的模式必须至少包含这些字符串之一才能在内部 TemporalAccessor
中获得 NANO_OF_DAY
字段,从中可以构造 LocalTime
。
我设法将 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/1854731462.queryFrom(Unknown Source)
at java.time.format.Parsed.query(Unknown Source)
... 4 more
我做错了什么?
你需要在模式中使用大写的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
使用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);
如果使用特定格式,根据API:
The string must represent a valid time and is parsed using
DateTimeFormatter.ISO_LOCAL_TIME
.
hh mm
24 小时必须
HH mm
或 12 小时
kk mm
处理的格式必须满足以下条件:
- 一天中的小时数的两位数。这是用零预填充以确保两位数。
- 冒号
- 两位数表示小时。这是用零预填充以确保两位数。
- 如果秒数不可用,则格式完成。
- 冒号
- 秒的两位数。这是用零预填充以确保两位数。
- 如果纳秒为零或不可用,则格式完成。
- 一个小数点
- 纳秒的一到九位数字。将根据需要输出任意数量的数字。
在这种情况下,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
文档说
The conversion uses the TemporalQueries.localTime() query, which relies on extracting the NANO_OF_DAY field.
您的错误告诉您 TemporalAccessor
只有两个字段,这两个字段都不是 NANO_OF_DAY
字段。使用 DateTimeFormatter
检索 LocalTime
的最小允许模式是:
DateTimeFormatter.ofPattern("ha");
DateTimeFormatter.ofPattern("Ka");
DateTimeFormatter.ofPattern("ah");
DateTimeFormatter.ofPattern("aK");
DateTimeFormatter.ofPattern("k");
DateTimeFormatter.ofPattern("H");
您的模式必须至少包含这些字符串之一才能在内部 TemporalAccessor
中获得 NANO_OF_DAY
字段,从中可以构造 LocalTime
。