period.parse()仅支持严格iso-8601期间格式(如p1y2m3d),要求大写p开头、y/m/d顺序固定且不可省略单位,不支持t段、小数、负号及空格等;负周期需用negated()或of()构造。

Java 中 Period.parse() 可以直接解析符合 ISO-8601 标准的期间字符串(如 P1Y2M3D),但必须严格遵循格式规范,且不支持带时间部分(如 T 段)或小数、负号等扩展形式。
支持的标准 ISO-8601 期间格式
Period.parse() 仅识别以 P 开头、后接年(Y)、月(M)、日(D)组合的字符串,顺序固定为年→月→日,字母大小写敏感,且不能省略单位标识符。
-
P1Y2M3D✅ 合法:1年2个月3天 -
P1Y✅ 合法:1年 -
P2M✅ 合法:2个月 -
P3D✅ 合法:3天 -
P1Y3D✅ 合法(允许跳过月,但单位顺序不可变) -
P1Y2M3DT❌ 非法:含无效T,Period不处理时间部分 -
p1y2m3d❌ 非法:P和单位字母必须大写 -
P1.5Y❌ 非法:不支持小数 -
-P1Y❌ 非法:不支持负号(如需负周期,需用Period.of(...)构造后取反)
基本用法示例
调用 Period.parse(String) 即可获得 Period 实例,后续可提取各字段或执行运算:
Period period = Period.parse("P1Y2M3D");
System.out.println(period.getYears()); // 输出:1
System.out.println(period.getMonths()); // 输出:2
System.out.println(period.getDays()); // 输出:3
常见错误与规避方式
解析失败会抛出 DateTimeParseException。遇到异常时,优先检查字符串是否满足 ISO-8601 期间语法,而非尝试正则或手动拆分。
- 确认字符串以大写
P开头,单位均为大写字母(Y/M/D) - 避免混入空格、逗号、中文字符或额外符号
- 若来源数据含非标准格式(如
"1年2个月"),需先预处理转成P1Y2M形式 - 需要表示“负周期”时,不要拼接负号,而用
period.negated()或Period.of(-1, -2, -3)
不支持但容易混淆的情况
Period 专用于年/月/日这类“日历期间”,和 Duration(秒级精确时长)职责不同:
-
P1DT2H3M❌ 无法解析:含T和小时/分钟,这是Duration的格式 -
PT2H30M✅ 应使用Duration.parse() - 想表达“1年零2天”,必须写成
P1Y2D,不能省略中间的M单位(即使值为 0)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











