java - 使用 Java DateTimeFormatter 类使用 am/pm 解析一天中的时间

标签 java java-8 java-time

我正在使用 Java DateTimeFormatter 来格式化给定时间并获取给定开始时间和结束时间之间的差异。但是我遇到了以下异常:

Exception in thread "main" java.time.format.DateTimeParseException: Text '1:23am' could not be parsed at index 0

下面是我的代码:

String dtStr = "1:23am-1:08am";
String t1 = dtStr.split("-")[0];
String t2 = dtStr.split("-")[1];
DateTimeFormatter format = DateTimeFormatter.ofPattern("hh:mma");
LocalTime time1 = LocalTime.parse(t1, format);
LocalTime time2 = LocalTime.parse(t2, format);
Duration dur = Duration.between(time1, time2);
System.out.println(dur.toMinutes() + " minutes " + dur.toSecondsPart() + " seconds");

我不确定我是否做错了什么。任何帮助将不胜感激。

最佳答案

您无法解析 String,因为您的格式模式中有两个 h 而不是一个,并且由于 am-pm of day 为小写字母。模式 String 中的 a 需要(标准/默认)大写,如 AM

您可以按照其他答案中所示操作 String,但也可以使用可以处理小写内容的 DateTimeFormatter。您只需要使用 DateTimeFormatterBuilder 构建一个并使其成为 parseCaseInsensitive() 应用Locale:

public static void main(String[] args) {
    String dtStr = "1:23am-1:08am";
    String t1 = dtStr.split("-")[0];
    String t2 = dtStr.split("-")[1];
    // build a formatter that parses lower case am-pm of day
    DateTimeFormatter format = new DateTimeFormatterBuilder()
                                    .parseCaseInsensitive() // handles lower- and upper-case 
                                    .appendPattern("h:mma")
                                    .toFormatter(Locale.ENGLISH); // doesn't reliably work without a Locale
    LocalTime time1 = LocalTime.parse(t1, format);
    LocalTime time2 = LocalTime.parse(t2, format);
    Duration dur = Duration.between(time1, time2);
    System.out.println(dur.toMinutes() + " minutes " + dur.toSecondsPart() + " seconds");
}

输出:

-15 minutes 0 seconds

这比在解析之前操作输入要灵活一些,因为它还可以解析当天的大写 am-pm。

关于java - 使用 Java DateTimeFormatter 类使用 am/pm 解析一天中的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73769155/

相关文章:

java - "Go Back"单个 URL Web 应用程序中文件夹和子文件夹的按钮

java - 如何仅使用客户端 JAVA 组合 AVI 和 WAV 文件?

java - 从包含毫秒的字符串中解析 ZonedDateTime

java - 将 org.joda.time 转换为 java.time

java - LocalDateTime (Java 8 API) 的 Setter 被调用两次

java - 如何阻止另一个类中的 JComponent?

java - 使用 Jersey 通过 REST 获取 CSRF token 并在登录中使用它

java - 将 if-else 转换为 lambda 表达式

java - 将对象列表转换为属性映射

java - 将带有周和年的字符串解析为 LocalDate