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

Apache POI读取解析表格日期时间为LocalDateTime报错求助

问题分析与修复方案

首先说清楚你哪里操作有误:你现在相当于拿着匹配A锁的钥匙去开B锁——cell.dateCellValue()返回的是java.util.Date对象,它的toString()方法会输出带星期、时区的完整格式(比如你看到的Sat Jun 20 14:29:39 CAT 2015),但你定义的DateTimeFormatter是dd/MM/yyyy HH:mm:ss,两种格式完全不匹配,解析肯定会抛出异常。

然后解释报错里的「CAT」:它是**Central Africa Time(中非时间)**的缩写,属于UTC+2时区,这是Date的toString()方法自动附加的本地时区信息,并非Excel单元格里存储的原始内容,是Java在转换字符串时额外加上的。

下面给你两种修复方案,优先推荐第一种:

推荐方案:直接转换日期对象(避免字符串解析)

完全没必要把Date转成字符串再解析,直接在日期对象之间转换更高效也更可靠:

// 先把Date转成Instant,再指定对应时区转成LocalDateTime
val cellDate = currentCell.dateCellValue
// CAT对应的标准时区ID是"Africa/Harare",如果你的系统默认时区就是CAT,也可以用ZoneId.systemDefault()
val createDate = cellDate.toInstant()
                   .atZone(ZoneId.of("Africa/Harare"))
                   .toLocalDateTime()

备选方案:匹配字符串格式解析(不推荐)

如果你非要通过字符串解析的方式,那得把DateTimeFormatter改成和Date.toString()输出一致的格式,还要指定英文Locale避免本地化问题:

// 必须指定Locale.ENGLISH,否则非英文环境下星期/月份的英文缩写会解析失败
private val dtf = DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH)

// 之后再执行解析
val createDate = LocalDateTime.parse(currentCell.dateCellValue.toString(), dtf)

总结一下:优先用第一种方案,直接在Date和LocalDateTime之间转换,能绕开字符串解析带来的格式不匹配、时区差异、本地化等各种坑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:31:52