我尝试使用DateTimeFormatter,但找不到方法。 Duration.parse("")仅使用特殊格式。
答案 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)
公认的答案指引了正确的方向,但它存在以下问题,初学者可能难以弄清楚和纠正:
PT
开头的 correct format of Duration
之后。%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)。