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

