自定义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
相关产品推荐
相关产品推荐

