如何解析不同的时间格式

时间:2019-03-03 16:05:07

标签: java datetime time localtime

我在字符串中有不同的时间格式(来自视频播放器计数器)。 例如:

svm__

如何使用LocalTime lib解析所有这些格式?

如果我使用这样的代码:

svm__kernel

它对于“ 1:03:45”或“ 11:03:45”可以正常工作,但对于“ 03:55”我有例外

svm__regressor__kernel

2 个答案:

答案 0 :(得分:1)

还有更多的可能性。我可能会去修改时间字符串以符合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})$", "PT$1H$2M$3S")
                .replaceFirst("^(\\d+):(\\d{2})$", "PT$1M$2S");
        System.out.println("Duration: " + Duration.parse(modifiedString));
    }

输出为:

Duration: PT3M45S
Duration: PT1H3M45S
Duration: PT123H3M45S

小时,分钟和秒(两个冒号)的情况是通过第一次调用replaceFirst处理的,这反过来又删除了两个冒号,并确保第二个replaceFirst不替换任何内容。在仅一个冒号(分钟和秒)的情况下,第一个replaceFirst无法替换任何内容,并且将字符串原样传递给第二个replaceFirst调用,后者依次转换为{接受的ISO 8601格式{1}}。

您需要Duration.parse类的原因有两个:(1)如果我正确理解,您的时间字符串表示一个持续时间,因此使用Duration是不正确的,这会使在您之后维护代码的人感到困惑。 (2)LocalTime的最大值为23:59:59.999999999,因此它将永远不会接受123:03:45。

答案 1 :(得分:0)

根据评论和我之前阅读的内容,您无法解析mm:ss,要解决您的问题,可以将所有时间都转换为秒,然后将该秒转换为持续时间,而不是到 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