Java中Duration.parse("1h")抛出DateTimeParseException如何解决
问题原因
你对Duration.parse方法的格式规则理解有误,该方法仅支持符合ISO-8601标准的时长格式字符串,语法为PnDTnHnMn.nS,你传入的"1h"不属于该格式支持的语法范围,因此抛出DateTimeParseException。
ISO-8601 时长格式规则:
- 字符串以标识时长的字符
P开头,若包含时分秒等时间单位,需要加T作为日期、时间部分的分隔符- 合法的单位后缀只有天(
D)、小时(H)、分钟(M)、秒(S),不存在小写h的小时简写语法- 1小时对应的合法入参是
"PT1H",而非"1h"
修复方案
根据你是否能修改配置值的格式,选对应方案即可:
- 如果可以调整配置中的时长值格式,直接把所有简写时长改成ISO-8601标准格式即可,原有代码不需要任何改动:
// 正确解析示例 Duration d = Duration.parse("PT1H");
- 如果配置中的
1h这类简写格式不能修改,可以自行实现一层简单的解析逻辑,兼容简写单位:
private static Duration parseCustomDuration(String text) { // 去除首尾空白 text = text.trim(); if (text.endsWith("h")) { long val = Long.parseLong(text.substring(0, text.length() - 1)); return Duration.ofHours(val); } else if (text.endsWith("m")) { long val = Long.parseLong(text.substring(0, text.length() - 1)); return Duration.ofMinutes(val); } else if (text.endsWith("s")) { long val = Long.parseLong(text.substring(0, text.length() - 1)); return Duration.ofSeconds(val); } // 兜底走JDK原生解析,兼容标准ISO格式 return Duration.parse(text); } // 调用示例,可正常解析1h、30m、20s、PT1H等格式 Duration d = parseCustomDuration("1h");
- 如果你的项目依赖Spring框架,可直接使用Spring内置的时长解析工具,无需自行实现解析逻辑,同时支持简写格式和标准ISO格式:
// 自动识别格式,1h、PT1H都可以正常解析 Duration d = DurationStyle.detectAndParse("1h");
内容的提问来源于stack exchange,提问作者roxhens
相关产品推荐
相关产品推荐

