org.apache.avro.util.Utf8无法解析为java.time.ZonedDateTime问题求助
问题原因
- 主动破坏了原始ISO格式的日期结构:你把输入
2020-04-19T19:00:54里的T替换为空格后,原本符合DateTimeFormatter.ISO_DATE_TIME规范的字符串格式失效,解析到索引10位置(原T的位置,替换后为空格)时无法匹配格式要求,直接触发解析异常。 - 日期类型逻辑错误:输入的
2020-04-19T19:00:54属于无时区信息的LocalDateTime格式,不能直接调用ZonedDateTime.parse()解析,该方法要求输入字符串必须携带时区信息,否则必然抛出解析异常。 - 冗余无效操作:第一段代码中将
LocalDateTime绑定系统默认时区后,又调用withZoneSameInstant传入同样的系统默认时区,没有任何实际作用,属于多余逻辑。 - 异常分支逻辑错误:第二段代码的catch分支中,依然尝试用
ZonedDateTime.parse解析已经被替换了T、且无时区信息的字符串,会再次触发异常,完全无法达到兜底效果。
修复后的代码示例
public ZonedDateTime convert(Utf8 date) { String originalDateStr = date.toString(); try { // 优先尝试解析带时区的ISO格式日期 return ZonedDateTime.from(DateTimeFormatter.ISO_DATE_TIME.parse(originalDateStr)) .withZoneSameInstant(ZoneId.systemDefault()); } catch (DateTimeException e) { // 无时区信息时,先解析为LocalDateTime,再绑定系统默认时区 LocalDateTime localDateTime = LocalDateTime.parse(originalDateStr, DateTimeFormatter.ISO_LOCAL_DATE_TIME); return localDateTime.atZone(ZoneId.systemDefault()); } }
内容的提问来源于stack exchange,提问作者Anchal Todariya
相关产品推荐
相关产品推荐

