我正在使用 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。