Spring Boot中如何解决字符串转OffsetDateTime时索引0解析异常
问题根因
LocalDateTime.parse() 无参数重载方法默认使用 ISO_LOCAL_DATE_TIME 规则解析字符串,要求日期部分必须为yyyy-MM-dd带分隔符格式,你传入的原始日期是yyyyMMdd无分隔符格式,且从报错信息看拼接后的时间字符串冒号后存在多余空格,完全不符合默认解析规则,因此抛出索引0位置解析失败的异常。
修复方案
自定义DateTimeFormatter匹配你拼接后的完整日期字符串格式,再用自定义格式化器完成解析即可。
修复后代码示例
// 先定义匹配日期格式的常量,以下格式匹配 20200723T00:00:00.00 格式的字符串 private static final DateTimeFormatter CUSTOM_DATE_PARSER = DateTimeFormatter.ofPattern("yyyyMMdd'T'HH:mm:ss.SSS"); // 注意修正DEFAULT_TIME里的多余空格,保证和上面的格式串完全匹配 private static final String DEFAULT_TIME = "T00:00:00.00"; // 替换为你业务实际使用的时区偏移 private static final ZoneOffset ZONE_OFF_SET_ACTIVATION_DATE = ZoneOffset.of("+8"); @Named("ofDate") default OffsetDateTime mapPostedDate(KDto kDto){ // 可按需添加非空校验 String fullDateStr = kDto.getOfDate() + DEFAULT_TIME; LocalDateTime activationDate = LocalDateTime.parse(fullDateStr, CUSTOM_DATE_PARSER); return activationDate.atOffset(ZONE_OFF_SET_ACTIVATION_DATE); }
注意事项
- 如果你的
DEFAULT_TIME不需要毫秒精度,可去掉格式串末尾的.SSS,保证格式串和实际拼接后的字符串完全一致即可 - 时区偏移请替换为业务实际使用的偏移值,避免入库后日期出现时区偏差
- 建议添加参数非空校验,避免
kDto.getOfDate()为null时触发空指针异常
内容的提问来源于stack exchange,提问作者Jhon
相关产品推荐
相关产品推荐

