【问题标题】:Why does this time fail to be parsed by DateTimeFormatter.ofPattern()? [duplicate]为什么这个时间不能被 DateTimeFormatter.ofPattern() 解析? [复制]
【发布时间】:2020-02-26 14:07:44
【问题描述】:

当我运行以下命令时:

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 指示符,但据我发现,这应该可以。我做错了什么?

【问题讨论】:

  • 你在哪个区域运行这个?由于您的代码没有指定语言环境,因此它将使用 JVM 的默认语言环境(这反过来将取自您当前用户或机器的默认语言环境)。 HH 也适用于 24 小时制,如果您还想包含 a,则需要使用 hh
  • 好的,看来我需要使用 'h' 并指定允许这种解析的语言环境。 (注意,我的默认语言环境是 'en-GB') String s2 = "07:05:45PM"; LocalTime 时间 = LocalTime .parse(s2, DateTimeFormatter.ofPattern("hh:mm:ssa").withLocale(Locale.US)); return time.format(DateTimeFormatter.ISO_LOCAL_TIME);
  • 在接受任何答案之前,我必须质疑版主投票关闭此问题作为重复问题的决定。引用的问题没有提及正在运行的语言环境,这是本实例中的关键细节。

标签: java java-8 localtime


【解决方案1】:

您正在使用 24 小时格式的说明符(并在 0700 表示 AM)。使用hh 而不是HH。喜欢,

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

【讨论】:

  • 想知道为什么这会是一个问题...检查了LocalTime.parse("16:12PM", DateTimeFormatter.ofPattern("HH:mma")),它会解析。但是 "04:12PM" 作为输入失败,但有异常。更糟糕的是,LocalTime.of(16,3,3).format(DateTimeFormatter.ofPattern("HH:mma")) 不会崩溃。我无法在此验证中找到逻辑(或至少是一致性)。
  • 你的“更糟糕”的例子没有调用 解析(只是格式化)。你的第一个例子就是这个问题。
  • @ernest_k:我认为逻辑很清楚:24 小时制的 16 点和 PM 并不矛盾。 24h 时钟上的 04 和 PM 确实相互矛盾。接受奇怪但有效模式的内部一致数据。同一模式的内部冲突数据将被拒绝。似乎很明智。类似地,“Sunday, 26. 2. 2020”不是有效日期,但“Wednesday, 26. 2. 2020”是。
  • @JoachimSauer 有道理,谢谢。我想我没有找到容忍冗余的理由,但我看到 API 不允许它破坏信息。谢谢
  • @ernest_k:有许多包含不必要冗余的日期格式(例如,基本上每种日期格式都包含一周中的某一天)。不支持它们将是一个重大缺陷。
【解决方案2】:

那是因为您使用了大写字母 H,它描述了 24 小时制中的一个小时,并导致 07PM 不匹配。

这样做:

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

【讨论】:

  • 我尝试使用小写字母 h,但也不起作用。
  • @ThatDataGuy 出了什么问题?你得到了同样的Exception吗?
  • 同样的例外
  • @ThatDataGuy 你有没有试过解析不同的时间Strings?您提供的那个根本无法解析,因为07PM 仅适用于较低的h。不使用PM 或使用AM 是否可以使用?
  • 这是由于我的语言环境 - 请参阅我对这个问题的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-18
  • 2012-06-20
相关资源
最近更新 更多