java - 如何使用 am/pm 解析简单时间

标签 java

我尝试使用 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 am”这样的时间,这就是为什么格式比上午 9 点的情况稍微复杂一些。存在不区分大小写的解析,因为我的数据有上午/下午,而不是上午/下午,并且在阅读了很多其他人在解析上午/下午时间时遇到问题后,我添加了默认位,所以不幸的是,这有点 cargo 崇拜.

我尝试过的一些其他格式字符串,只是为了排除它们:

"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() 之前。

关于java - 如何使用 am/pm 解析简单时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48068517/

相关文章:

java - iText 5 页眉和页脚

java - 合金 UI 时间格式 24 小时 Liferay 6

java - JAX-RS 使用的无状态 EJB 中的 @Context 注入(inject)

java - 使用 Java 仅在文件的第一行将计数器附加到多个相同的列字

java - 设计 super 英雄游戏

Java EL 评估 bean 的属性

java - Java中Upcasted对象如何存储在Heap中

java - 这个代码块有什么作用?

java - Dynamodb 写入操作

java - Netbeans 运行 Java 但没有显示输出