【问题标题】:LocalTime parsing with AM/PM使用 AM/PM 进行 LocalTime 解析
【发布时间】:2018-12-15 17:08:37
【问题描述】:

我有一个来自另一个来源的时间字符串,格式为“hh:mma”,例如 10:00a 或 07:30p。我需要从该字符串创建LocalTime 的实例。我试图通过调用该方法来解析它: LocalTime.parse("10:00p", DateTimeFormatter.ofPattern("hh:mma")),但它会抛出 DateTimeParseException。按照DateTimeFormatter API,部分时间应该是大写的,由2个字母组成(PM而不是p)。但是有什么方法可以在不改变源代码的情况下解析时间吗?

【问题讨论】:

  • 你能分享你的代码吗
  • @fiskra 代码已经存在,内嵌在文本中。

标签: java datetime


【解决方案1】:

p 替换为PM,将a 替换为AM,然后将其解析为模式hh:mm a

String time = "10:00p";
time = time.replace("p", "PM").replace("a", "AM"); // 10:00PM
LocalTime localTime = LocalTime.parse(time, DateTimeFormatter.ofPattern("hh:mm a", Locale.US));
System.out.println(localTime); // 22:00

【讨论】:

  • 可能有效,但您应该指向您的Locale.US,这在白俄罗斯不太可能在任何情况下都产生所需的输出。也许Locale.getDefault() 会是更好的选择。
  • @deHaar 用于识别AMPM,不用于格式化。
  • 感谢您的回答。但我问是否可以解析字符串而不对其进行任何更改
【解决方案2】:

但是有什么方法可以在不改变源的情况下解析时间 行吗?

是的,这个格式化程序可以为你做到这一点:

    Map<Long, String> ampmStrings = Map.of(0L, "a", 1L, "p");
    DateTimeFormatter timeFormatter = new DateTimeFormatterBuilder()
            .appendPattern("hh:mm")
            .appendText(ChronoField.AMPM_OF_DAY, ampmStrings)
            .toFormatter();

使用DateTimeFormatterBuilder.appendText,我们可以为格式化和解析定义自己的文本。我使用 Java 9+ Map.of 来初始化两个键值对的映射。如果您使用的是 Java 6、7 或 8,我相信您会以不同的方式初始化地图。其余的应该仍然有效。

让我们试试吧:

    String sourceLine = "10:00a";
    LocalTime time = LocalTime.parse(sourceLine, timeFormatter);
    System.out.println("Parsed time: " + time);

输出是:

解析时间:10:00

如果您可以说服您的来源提供ISO 8601 format 中的字符串(如10:0019:30),则更好的选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2015-01-06
    • 1970-01-01
    相关资源
    最近更新 更多