如何用am / pm

时间:2018-01-02 22:09:27

标签: 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分那样解析时间,这就是为什么格式比早上9点的情况要复杂一些。不区分大小写的解析是因为我的数据是am / pm,而不是AM / PM,并且在阅读了很多其他人在解析am / pm时遇到问题后添加了默认位,所以它有点货物 - 不幸的是。

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

"h[:mm]a"
"ha"

虽然索引位置发生了变化,但仍会发生同样的错误。

TIA!

1 个答案:

答案 0 :(得分:3)

您指定的格式要求使用两位数指定小时数,但之后只提供一位数。

使用import os def get_existing_dir(): my_dir = input("Please enter a directory name : ") while True: if os.path.exists(my_dir): return my_dir my_dir = input("Please enter an existing directory name : ") 或将格式更改为只需要一位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()之前。