当前位置: 首页 > 面试题库 >

使用DateTimeFormatter解析AM / PM时间时,Java 8 DateTimeParseException

吴同
2023-03-14
问题内容

我正在尝试使用Java 8
java.time.format.DateTimeFormatter将格式化的字符串解析为java.time.LocalTime对象。但是,我在解析某些输入字符串时遇到了一些问题。当我的输入字符串具有“
AM”时,它将正确解析,但是当我的字符串具有“ PM”时,它将引发异常。这是一个简单的例子:

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public class FormatterExample {
    private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm a");
    public static void main(String[] args) {
        parseDateAndPrint("08:06 AM");
        parseDateAndPrint("08:06 PM");
    }
    public static void parseDateAndPrint(String time) {
        LocalTime localTime = LocalTime.parse((time), timeFormatter);
        System.out.println(localTime.format(timeFormatter));
    }
}

输出:

08:06 AM
Exception in thread "main" java.time.format.DateTimeParseException: Text '08:06 PM' could not be parsed: Conflict found: Field AmPmOfDay 0 differs from AmPmOfDay 1 derived from 08:06
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1919)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1854)
    at java.time.LocalTime.parse(LocalTime.java:441)
    at FormatterExample.parseDateAndPrint(FormatterExample.java:11)
    at FormatterExample.main(FormatterExample.java:8)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Caused by: java.time.DateTimeException: Conflict found: Field AmPmOfDay 0 differs from AmPmOfDay 1 derived from 08:06
    at java.time.format.Parsed.crossCheck(Parsed.java:582)
    at java.time.format.Parsed.crossCheck(Parsed.java:563)
    at java.time.format.Parsed.resolve(Parsed.java:247)
    at java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1954)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1850)
    ... 8 more

因此08:06 AM可以正确解析,但是08:06 PM会在消息中抛出DateTimeParseException:

Text '08:06 PM' could not be parsed: Conflict found: Field AmPmOfDay 0 differs from AmPmOfDay 1 derived from 08:06

但是,这就是我遇到的问题。.我不太确定该错误的确切含义,但这绝对与输入字符串的AM /
PM部分有关。我也尝试搜索类似的错误,但找不到任何东西。我有一种感觉,我可能在定义格式程序模式时犯了一个简单的错误,但是我被卡住了。任何帮助,将不胜感激!


问题答案:

您使用的是错误的模式,H小时(0-23) ;你需要h

错误告诉您这H24 小时,8因此显然是上午。因此,当您告诉解析器8在24小时制上使用并且还告诉解析器它是PM时,它就耗光了。

简而言之,请阅读文档。



 类似资料:
  • 但这就是我卡住的地方..我不确定这个错误到底是什么意思,但它肯定与输入字符串的AM/PM部分有关。我也尝试搜索类似的错误,但我没有找到任何东西。我有一种感觉,我可能在定义格式化程序模式时犯了一个简单的错误,但我卡住了。任何帮助都将不胜感激!

  • 我在这里有我的日期来自我的API,我试图在其中解析到。我使用intl包尝试了以下方法,但我遇到了错误 未处理的异常:格式异常:尝试从 2020/07/07 09:47:54 在位置 20 读取 有人知道这里出了什么问题吗?

  • 问题内容: 我正在尝试使用Java 8 DateTime API解析日期时间字符串。 要解析的字符串包含日期,月份,年份和AM / PM标记,例如。我使用以下模式:并且我希望将解析的LocalDateTime时间部分设置为AM / PM标记或取决于AM / PM标记。 使用以前的API,解析可以使用此模式按预期进行。 但是当我使用Java 8 DateTime API并运行以下代码时: 我得到以下

  • 我得到一个变量字符串,如下所示: 上午8点45分 如果是下午,则希望将其转换为24小时制。这样我就可以放下am/pm,用它来做别的事情。 我可以像这样轻松地放弃am/pm: 当然,如果我这样做,我不知道字符串是am还是pm,所以我不知道在字符串上加上12小时,使它成为24小时。 有人知道我该如何解决这个问题吗?我绝对无法更改我得到的变量输入,它将始终是小时(在 12 小时内)、分钟和 am 或 p

  • 问题内容: 我要格式化的字符串如下所示:String datetime =“ 9/1/10 11:34:35 AM” SimpleDateFormat的以下模式有效: 但是,我还需要解析AM / PM标记,当我将其添加到模式中时会收到异常。 无效的模式: 我也尝试过与此相同的例外: 例外: 我已经通过http://download.oracle.com/javase/1.4.2/docs/api/

  • 问题内容: 当前时间显示为13:35 PM, 但是我想以AM / PM显示为12小时格式,即1:35 PM而不是13:35 PM 当前代码如下 问题答案: 最简单的方法,通过使用最新模式得到它- ,其中 -上午/下午的小时数(1-12) -小时 -上午/下午标记 程式码片段: