使用AM / PM进行LocalTime解析

时间:2018-12-14 13:08:03

标签: java datetime

我有一个时间字符串来自另一个来源,格式为“ hh:mma”,例如10:00a或07:30p。我需要从该字符串创建LocalTime的实例。我试图通过调用方法来解析它: LocalTime.parse("10:00p", DateTimeFormatter.ofPattern("hh:mma")),但它抛出一个DateTimeParseException。根据{{​​3}},部分时间应使用大写字母,并由2个字母(PM代替p)组成。但是,有什么方法可以解析时间而不改变路线呢?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

  

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

是的,此格式化程序可以为您完成此操作:

    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)。