Duration.parse() 可直接解析 ISO-8601 持续时间字符串(如"PT15M"),支持P/T前缀、大小写敏感单位及小数秒,但不支持省略前缀、小写单位或分钟等单位用小数,需try-catch防护。

Java 中 Duration.parse() 可以直接解析符合 ISO-8601 持续时间格式的字符串,例如 "PT15M"(表示 15 分钟),无需额外配置或依赖。
支持的标准 ISO-8601 持续时间格式
Duration.parse() 严格遵循 ISO-8601 的持续时间表示规范,常见合法格式包括:
-
"PT15M"—— 15 分钟(P表示 period,T表示 time part) -
"PT2H30M"—— 2 小时 30 分钟 -
"P2D"—— 2 天(注意:Duration不包含日期单位的“日历”语义,它按 24 小时计算) -
"PT0.5S"—— 500 毫秒(支持小数秒) -
"P1DT2H3M4.5S"—— 1 天 2 小时 3 分 4.5 秒(等价于86400 + 7200 + 180 + 4.5 = 93784.5秒)
基本用法示例
直接调用静态方法即可:
Duration d1 = Duration.parse("PT15M"); // 15 分钟 → 900 秒
Duration d2 = Duration.parse("PT2H30M"); // 2.5 小时 → 9000 秒
Duration d3 = Duration.parse("P1DT12H"); // 36 小时 → 129600 秒
解析成功后得到的是 Duration 实例,可通过 getSeconds()、toMinutes()、toMillis() 等方法获取对应数值。
立即学习“Java免费学习笔记(深入)”;
不支持的常见写法(会抛异常)
Duration.parse() 对格式非常严格,以下写法均会抛出 DateTimeParseException:
-
"15M"或"15 minutes"—— 缺少P和T前缀 -
"P15M"—— 错误:分钟必须在T之后(PT15M才对) -
"PT15m"—— 单位字母必须大写(M,不是m) -
"PT1.5M"—— ISO-8601 不允许对分钟等单位使用小数,只能对秒用小数(如PT1.5S)
安全解析建议(避免崩溃)
生产环境推荐加 try-catch,并提供默认值或日志:
public static Duration safeParse(String text) {
try {
return Duration.parse(text);
} catch (DateTimeParseException e) {
System.err.println("Invalid duration format: " + text);
return Duration.ZERO;
}
}
也可结合 Optional 封装更函数式风格的处理逻辑。


















