Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用am/pm解析简单时间_Java - Fatal编程技术网

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

Java 如何使用am/pm解析简单时间,java,Java,我曾经尝试过用Java8API进行解析,但失败得很惨。很明显,我缺少一些基本的东西。下面是一个简单的例子: final DateTimeFormatter simpleFormat = new DateTimeFormatterBuilder(). appendPattern("h[h][:mm]a"). parseCaseInsensitive(). parseDefaulting(ChronoField.MINU

我曾经尝试过用Java8API进行解析,但失败得很惨。很明显,我缺少一些基本的东西。下面是一个简单的例子:

    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更新了示例并添加了关于顺序重要性的通知。