You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中Duration.parse("1h")抛出DateTimeParseException如何解决

问题原因

你对Duration.parse方法的格式规则理解有误,该方法仅支持符合ISO-8601标准的时长格式字符串,语法为PnDTnHnMn.nS,你传入的"1h"不属于该格式支持的语法范围,因此抛出DateTimeParseException。

ISO-8601 时长格式规则:

  1. 字符串以标识时长的字符P开头,若包含时分秒等时间单位,需要加T作为日期、时间部分的分隔符
  2. 合法的单位后缀只有天(D)、小时(H)、分钟(M)、秒(S),不存在小写h的小时简写语法
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:45:42