Java 为什么DateTimeFormatter.ofPattern()无法解析此时间?

Java 为什么DateTimeFormatter.ofPattern()无法解析此时间?,java,java-8,localtime,Java,Java 8,Localtime,当我运行以下命令时: String s2 = "07:05:45PM"; LocalTime time = LocalTime.parse(s2, DateTimeFormatter.ofPattern("HH:mm:ssa")); 我得到: Exception in thread "main" java.time.format.DateTimeParseException: Text '07:05:45PM' could not be parsed at index 8 它似乎不像AM/P

当我运行以下命令时:

String s2 = "07:05:45PM";
LocalTime time = LocalTime.parse(s2, DateTimeFormatter.ofPattern("HH:mm:ssa"));
我得到:

Exception in thread "main" java.time.format.DateTimeParseException:
Text '07:05:45PM' could not be parsed at index 8

它似乎不像AM/PM指示器,但据我所知,这应该是可行的。我做错了什么?

您正在使用24小时格式的说明符(并说上午7点我在那里)。使用
hh
代替
hh
。像

LocalTime time = LocalTime.parse(s2, DateTimeFormatter.ofPattern("hh:mm:ssa"));

这是因为您使用的是大写的
H
,它描述了24小时符号中的一小时,并导致
07
PM
之间不匹配

这样做:

public static void main(String[] arguments) {
    String time = "07:05:45PM";
    LocalTime localTime = LocalTime.parse(time, DateTimeFormatter.ofPattern("hh:mm:ssa"));

    System.out.println(localTime.toString());
}
输出是

19:05:45

您运行此操作的语言环境是什么?因为您的代码没有指定区域设置,所以它将使用JVM的默认区域设置(这反过来将取自当前用户或机器的默认设置)。另外,
HH
也适用于24小时时钟,如果您还想包含
a
,您需要使用
HH
。好的,看来我需要使用“h”并指定一个允许此解析的区域设置。(注意,我的默认语言环境是'en-GB')字符串s2=“07:05:45PM”;LocalTime time=LocalTime.parse(s2,DateTimeFormatter.ofPattern(“hh:mm:ssa”).withLocale(Locale.US));返回时间.format(DateTimeFormatter.ISO_本地时间);我必须质疑主持人的决定,即在接受任何答案之前,投票以重复方式结束这个问题。引用的问题没有引用正在运行的区域设置,这是本例中的关键细节。不知道为什么会出现问题。。。选中
LocalTime.parse(“16:12PM”,DateTimeFormatter.of模式(“HH:mma”))
,它将进行解析。但
“04:12PM”
,因为输入异常失败。更糟糕的是,
LocalTime.of(16,3,3).format(DateTimeFormatter.of模式(“HH:mma”)
不会崩溃。我在这个验证中找不到逻辑(或者至少是一致性)。您的“更糟糕”的示例没有调用解析(只是格式化)。你的第一个例子和这个问题一模一样。@ernest_k:我认为逻辑相当明确,24小时时钟上的clar:16和PM不矛盾。24小时04点和下午4点确实相互矛盾。接受奇怪但有效模式的内部一致数据。拒绝相同模式的内部冲突数据。看起来很明智。同样,“2020年2月26日星期日”不是有效日期,但“2020年2月26日星期三”是有效日期。@JoachimSauer说得通,谢谢。我想我没有找到容忍冗余的理由,但我看到API不允许它破坏信息。Thanks@ernest_k:有许多日期格式包含不必要的冗余(例如,基本上每个日期格式都包含一周中的一天)。不支持它们将是一个重大缺陷。我尝试使用小写字母h,但也不起作用。@ThatDataGuy怎么了?您是否得到相同的
异常
?相同exception@ThatDataGuy您是否尝试分析不同的时间
字符串
s?因为
07
PM
只能与较低的
h
一起使用,所以您提供的一个根本无法解析。它是在没有
PM
的情况下工作,还是在使用
AM
的情况下工作?这是由于我的语言环境造成的-请参阅我对问题的评论。