Java 8 Time API:如何将格式字符串“mm:ss”解析为Duration?

时间:2014-07-08 22:28:57

标签: datetime java-8

我尝试使用DateTimeFormatter,但找不到方法。 Duration.parse("")仅使用特殊格式。

3 个答案:

答案 0 :(得分:6)

您可以自己解析String并将其重新格式化为Duration

所需的格式
String value = ... //mm:ss
String[] fields = value.split(":");
return Duration.parse(String.format("P%dM%sS", fields[0], fields[1]));

答案 1 :(得分:0)

恕我直言,java 8没有为自定义持续时间解析提供任何工具。

您应该“手动”执行此操作。例如(一种有效的方式):

import static java.lang.Integer.valueOf;

import java.time.Duration;

public class DurationParser {
    public static Duration parse(String input) {
        int colonIndex = input.indexOf(':');
        String mm = input.substring(0, colonIndex);
        String ss = input.substring(colonIndex + 1);
        return Duration.ofMinutes(valueOf(mm)).plusSeconds(valueOf(ss));
    }
}

答案 2 :(得分:0)

公认的答案指引了正确的方向,但它存在以下问题,初学者可能难以弄清楚和纠正:

  1. 它没有跟在以 PT 开头的 correct format of Duration 之后。
  2. 对于 %s,它应该使用 %d 而不是 fields[0],因为 fields[0] 的类型是 String

改正这两件事后,return语句就变成了

return Duration.parse(String.format("PT%sM%sS", fields[0], fields[1]));

拆分和格式化的替代方法是使用 String#replaceAll,如下所示:

import java.time.Duration;

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(parseToDuration("09:34"));
        System.out.println(parseToDuration("90:34"));
        System.out.println(parseToDuration("9:34"));
        System.out.println(parseToDuration("0:34"));
        System.out.println(parseToDuration("00:04"));
        System.out.println(parseToDuration("1:2"));
    }

    static Duration parseToDuration(String value) {
        return Duration.parse(value.replaceAll("(\\d{1,2}):(\\d{1,2})", "PT$1M$2S"));
    }
}

输出:

PT9M34S
PT1H30M34S
PT9M34S
PT34S
PT4S
PT1M2S

正则表达式 (\d{1,2}):(\d{1,2}) 有两个 capturing groups:group(1) 用 $1 指定,group(2) 用替换字符串中的 $2 指定。每个捕获组都有 \d{1,2} 指定 1 to 2 digit(s)