我正在尝试使用Java 8 API解析一些问题并且它失败了。显然我遗漏了一些基本的东西。这是一个简单的例子:
final DateTimeFormatter simpleFormat = new DateTimeFormatterBuilder().
appendPattern("h[h][:mm]a").
parseCaseInsensitive().
parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0).
parseDefaulting(ChronoField.AMPM_OF_DAY, 0).
toFormatter();
simpleFormat.parse("9am", LocalTime::from);
simpleFormat.parse("11am", LocalTime::from);
simpleFormat.parse("9pm", LocalTime::from);
simpleFormat.parse("11pm", LocalTime::from);
这给了我:
Exception in thread "main" java.time.format.DateTimeParseException: Text '9pm' could not be parsed at index 1
我也希望能够像“上午12:30”那样解析时间,这就是为什么格式比早上9点的情况要复杂一些。不区分大小写的解析是因为我的数据是am / pm,而不是AM / PM,并且我在阅读了很多其他人解析上午/下午时间之后添加了默认位,所以不幸的是它有点货物结果。
我试过的一些其他格式字符串,只是为了排除它们:
"h[:mm]a"
"ha"
尽管索引位置发生变化,但仍会发生相同的错误。
TIA!
您指定的格式要求使用两位数指定小时数,但之后只提供一位数。
使用09am
或更改您的格式只需要一个数字h[:mm]a
。
DateTimeFormatter simpleFormat = new DateTimeFormatterBuilder().
parseCaseInsensitive().
appendPattern("h[:mm]a").
parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0).
parseDefaulting(ChronoField.AMPM_OF_DAY, 0).
toFormatter();
System.err.println(simpleFormat.parse("09AM", LocalTime::from));
System.err.println(simpleFormat.parse("09:12AM", LocalTime::from));
System.err.println(simpleFormat.parse("9AM", LocalTime::from));
这给出了输出
09:00
09:12
09:00
请注意,parseCaseInsensitive()
必须在appendPattern()
之前。