如何解析不同的时间格式

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.