我在字符串中有不同的时间格式(来自视频播放器计数器)。 例如:
svm__
如何使用LocalTime lib解析所有这些格式?
如果我使用这样的代码:
svm__kernel
它对于“ 1:03:45”或“ 11:03:45”可以正常工作,但对于“ 03:55”我有例外
svm__regressor__kernel
答案 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