Java 如何使用am/pm解析简单时间
我曾经尝试过用Java8API进行解析,但失败得很惨。很明显,我缺少一些基本的东西。下面是一个简单的例子:Java 如何使用am/pm解析简单时间,java,Java,我曾经尝试过用Java8API进行解析,但失败得很惨。很明显,我缺少一些基本的东西。下面是一个简单的例子: final DateTimeFormatter simpleFormat = new DateTimeFormatterBuilder(). appendPattern("h[h][:mm]a"). parseCaseInsensitive(). parseDefaulting(ChronoField.MINU
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 am”这样的时间,这就是为什么格式比上午9点的情况要复杂一点的原因。不区分大小写的解析是存在的,因为我的数据有am/pm,而不是am/pm,而且我在阅读了很多其他人在解析am/pm时间方面有问题后添加了默认位,所以很遗憾,这有点麻烦
我尝试过其他一些格式字符串,只是为了排除它们:
"h[:mm]a"
"ha"
虽然索引位置发生变化,但也会发生相同的错误
蒂亚 您指定的格式要求用两位数字指定小时,但只提供一位 使用
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
请注意,
parseCaseSensitive()
必须在appendPattern()
之前。好的,生成器的操作顺序似乎很重要。我做了另一个更新。你的答案非常接近,我想给你一个信用!让我看看我是否可以编辑它,并使它达到我刚刚开始工作的状态。嗯,你没有接受我的编辑,所以我将为未来的读者发表评论。ParseCaseSensitive只要在appendPattern之前,就可以像广告中宣传的那样工作。@JamesWaldrop I更新了示例并添加了关于顺序重要性的通知。