时间格式数据读取后比文件中的数据少5分43秒(服务器时区为GMT+8)
触发场景描述
Excel中包含时间格式数据(如: 13:00:00), 并且Easyexcel运行环境的系统默认时区不是UTC时区时(通过ZoneId.systemDefault()获取), 最终读取到的数据将会比文件中的数据少5‘43’‘; 该问题从3.2.0版本开始出现, 应当是
触发Bug的代码
使用Easyexcel中的ReadTest.java可直接重现, 仅需要在DemoData类中增加一个String类型的成员变量: private String timeData;, 并在demo.xlsx文件中增加一列时间数据即可, 可参考以下截图
提示的异常或者没有达到的效果
DemoData类
demo.xlsx文件
运行ReadTest.java之后控制台打印结果
其他补充信息
ReadTest中读取文件前通过TimeZone.setDefault(TimeZone.getTimeZone("UTC"));将时区设置成UTC可正确读取文件中的时间内容- 项目中将版本降到
3.1.5可正确读取文件中的时间内容 - 该问题应该出自改动: https://github.com/alibaba/easyexcel/commit/b92c40554704ae3182847ad4a9938b052744c800, 这里将
DataFormatter的getFormattedDateString中DateUtil工具类换成了DateUtils, 而DateUtils.getJavaDate中在转换成LocelDateTime之后转换成了系统默认时区.atZone(ZoneId.systemDefault()), 从而导致了读取数据的问题
我貌似找到一种可以一种解决办法,我猜想的是你写入数据的时候写入到excel中是,是数字类型(excel中实际存储的,这个可以根据转换枚举校验出来com.alibaba.excel.enums.CellDataTypeEnum)。而我直接写入字符串到excel中,读取是不会收到影响的。如果你对你的数据类型是String,那写入和读出都是String不会触发这个bug,当然具体这个bug我也会尝试去修复它
嗯嗯, 是的, 我们这边的Excel文件内容是由用户手动填充的, 因此单元格的内容的类型并不好控制。一个有意思的事情是, 如果设置use1904windowing(true), 读取到的也是正确的内容(但我检查了Excel选项中并没有启用使用1904日期系统的配置).
ReadTest中读取文件前通过TimeZone.setDefault(TimeZone.getTimeZone("UTC"));将时区设置成UTC可正确读取文件中的时间内容
另外, 关于我说的这点有点问题, 我改运行环境的时区为UTC是可以的, 在测试方法里面用TimeZone.setDefault也是可以的, 但直接DateUtils.getJavaDate代码里的时区好像拿到的结果却有问题.
解析excel的时候 是不是可以加一个入参就是时区,如果这个参数有值就按传入的时区计算,如果这个参数没有值就按系统默认时区计算
3.3.2版本也遇到了