如何解析不同的时间格式
How to parse different time formats
我在字符串中有不同的时间格式(来自视频播放器计数器)。
例如:
03:45 -> 3 munutes, 45 seconds
1:03:45 -> 1 hour, 3 munutes, 45 seconds
123:03:45 -> 123 hours, 3 munutes, 45 seconds
如何使用 LocalTime 库解析所有这些格式?
如果我使用这样的代码:
LocalTime.parse(time, DateTimeFormatter.ofPattern("[H[H]:]mm:ss"));
它适用于“1:03:45”或“11:03:45”,但对于“03:55”我有例外
java.time.format.DateTimeParseException: Text '03:55' could not be parsed at index 5
根据评论和我之前阅读的内容,您无法解析 mm:ss
,为了解决您的问题,让我们将所有时间转换为秒,然后将该秒转换为 Duration 而不是 LocalTime,这是解决您的问题的方法:
String[] times = {"03:45", "1:03:45", "123:03:45"};
for (String time : times) {
List<Integer> parts = Arrays.stream(time.split(":"))
.map(Integer::valueOf)
.collect(Collectors.toList());
Collections.reverse(parts);
int seconds = (int) IntStream.range(0, parts.size())
.mapToDouble(index -> parts.get(index) * Math.pow(60, index))
.sum();
Duration result = Duration.ofSeconds(seconds);
System.out.println(result);
}
输出或持续时间为
PT3M45S -> 03:45
PT1H3M45S -> 1:03:45
PT123H3M45S -> 123:03:45
还有更多的可能性。我可能会修改时间字符串以符合 Duration.parse
.
接受的语法
String[] timeStrings = { "03:45", "1:03:45", "123:03:45" };
for (String timeString : timeStrings) {
String modifiedString = timeString.replaceFirst("^(\d+):(\d{2}):(\d{2})$", "PTHMS")
.replaceFirst("^(\d+):(\d{2})$", "PTMS");
System.out.println("Duration: " + Duration.parse(modifiedString));
}
输出为:
Duration: PT3M45S
Duration: PT1H3M45S
Duration: PT123H3M45S
小时、分钟和秒(两个冒号)的大小写由对 replaceFirst
的第一次调用处理,这反过来会删除两个冒号并确保第二个 replaceFirst
不会更换任何东西。在只有一个冒号(分和秒)的情况下,第一个 replaceFirst
不能替换任何内容并将字符串原封不动地传递给第二个 replaceFirst
调用,后者又转换为 [ 接受的 ISO 8601 格式=12=].
您需要 Duration
class 有两个原因:(1) 如果我理解正确,您的时间字符串表示持续时间,因此使用 LocalTime
是不正确的并且会混淆那些在你之后维护你的代码。 (2) aLocalTime
的最大值是23:59:59.999999999,所以永远不会接受123:03:45.
我在字符串中有不同的时间格式(来自视频播放器计数器)。 例如:
03:45 -> 3 munutes, 45 seconds
1:03:45 -> 1 hour, 3 munutes, 45 seconds
123:03:45 -> 123 hours, 3 munutes, 45 seconds
如何使用 LocalTime 库解析所有这些格式?
如果我使用这样的代码:
LocalTime.parse(time, DateTimeFormatter.ofPattern("[H[H]:]mm:ss"));
它适用于“1:03:45”或“11:03:45”,但对于“03:55”我有例外
java.time.format.DateTimeParseException: Text '03:55' could not be parsed at index 5
根据评论和我之前阅读的内容,您无法解析 mm:ss
,为了解决您的问题,让我们将所有时间转换为秒,然后将该秒转换为 Duration 而不是 LocalTime,这是解决您的问题的方法:
String[] times = {"03:45", "1:03:45", "123:03:45"};
for (String time : times) {
List<Integer> parts = Arrays.stream(time.split(":"))
.map(Integer::valueOf)
.collect(Collectors.toList());
Collections.reverse(parts);
int seconds = (int) IntStream.range(0, parts.size())
.mapToDouble(index -> parts.get(index) * Math.pow(60, index))
.sum();
Duration result = Duration.ofSeconds(seconds);
System.out.println(result);
}
输出或持续时间为
PT3M45S -> 03:45
PT1H3M45S -> 1:03:45
PT123H3M45S -> 123:03:45
还有更多的可能性。我可能会修改时间字符串以符合 Duration.parse
.
String[] timeStrings = { "03:45", "1:03:45", "123:03:45" };
for (String timeString : timeStrings) {
String modifiedString = timeString.replaceFirst("^(\d+):(\d{2}):(\d{2})$", "PTHMS")
.replaceFirst("^(\d+):(\d{2})$", "PTMS");
System.out.println("Duration: " + Duration.parse(modifiedString));
}
输出为:
Duration: PT3M45S Duration: PT1H3M45S Duration: PT123H3M45S
小时、分钟和秒(两个冒号)的大小写由对 replaceFirst
的第一次调用处理,这反过来会删除两个冒号并确保第二个 replaceFirst
不会更换任何东西。在只有一个冒号(分和秒)的情况下,第一个 replaceFirst
不能替换任何内容并将字符串原封不动地传递给第二个 replaceFirst
调用,后者又转换为 [ 接受的 ISO 8601 格式=12=].
您需要 Duration
class 有两个原因:(1) 如果我理解正确,您的时间字符串表示持续时间,因此使用 LocalTime
是不正确的并且会混淆那些在你之后维护你的代码。 (2) aLocalTime
的最大值是23:59:59.999999999,所以永远不会接受123:03:45.