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

自定义DateTimeFormatter用于OffsetDateTime解析时触发DateTimeParseException

解决OffsetDateTime解析时的DateTimeParseException问题

嘿,我看了你的代码片段,问题很清晰:你现在构建的Formatter只处理了本地日期时间的格式(比如yyyy-MM-ddTHH:mm:ss),但OffsetDateTime要求必须包含时区偏移信息(像+08:00、-0500或者代表UTC的Z),这就是为啥解析会报错。

怎么修复?

你只需要在DateTimeFormatterBuilder里加上偏移量的解析规则就行,常用的两种方式:

  • 用appendOffsetId():适配标准的偏移格式,能处理各种合法的偏移写法
  • 用appendOffset("+HH:mm", "Z"):可以更精准地指定你要支持的偏移格式(比如强制带冒号的偏移,或者用Z代表UTC)

给你补全后的完整代码示例:

final DateTimeFormatter ISO_OFFSET_DATE_TIME;
ISO_OFFSET_DATE_TIME = new DateTimeFormatterBuilder()
        .appendValue(YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
        .appendLiteral('-')
        .appendValue(MONTH_OF_YEAR, 2)
        .appendLiteral('-')
        .appendValue(DAY_OF_MONTH, 2)
        .appendLiteral('T')
        .appendValue(HOUR_OF_DAY, 2)
        .appendLiteral(':')
        .appendValue(MINUTE_OF_HOUR, 2)
        .appendLiteral(':')
        .appendValue(SECOND_OF_MINUTE, 2)
        // 关键:添加偏移量解析逻辑
        .appendOffsetId()
        .toFormatter();

// 测试一下,比如解析带东八区偏移的时间
String testDateTime = "2024-05-20T15:40:20+08:00";
OffsetDateTime parsedOdt = OffsetDateTime.parse(testDateTime, ISO_OFFSET_DATE_TIME);
System.out.println(parsedOdt);

额外小提示:

  • 如果你的输入时间包含秒的小数部分(比如2024-05-20T15:40:20.123+08:00),可以在appendValue(SECOND_OF_MINUTE, 2)之后加上.appendFraction(SECOND_OF_MINUTE, 0, 9, true),这样就能解析小数秒了
  • 其实JDK已经内置了标准的偏移日期时间格式器:DateTimeFormatter.ISO_OFFSET_DATE_TIME,如果你的需求刚好符合ISO标准格式,直接用这个内置的会更省事,不用自己手动拼Builder~

内容的提问来源于stack exchange,提问作者user737862

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:05:15