Flutter读取Excel日期转DateTime报Invalid Date Format错误如何解决
Flutter 解析Excel日期报错解决方案
问题根因
- 内置
DateTime.parse()仅支持ISO 8601格式(yyyy-MM-dd结构)的字符串解析,无法直接识别dd-MM-yyyy(日-月-年)格式的日期字符串,因此会抛出"Invalid Date Format"错误。 - 读取到44734这类数字是Excel的原生日期存储规则:Excel默认将日期存储为1899年12月30日起的天数偏移值,如果你只是修改了单元格展示样式、没有真正将单元格格式设置为文本后再输入内容,读取到的底层值就是数字序列号,而非你肉眼看到的格式化日期字符串。
可落地方案
根据读取到的值类型,分两种场景处理即可:
场景1:读取到的值为dd-MM-yyyy格式的字符串
使用intl包的DateFormat指定匹配格式解析,不要用内置parse方法:
- 先在
pubspec.yaml中添加intl依赖,版本适配当前Flutter SDK即可 - 导入包后执行解析:
import 'package:intl/intl.dart'; // 解析格式必须和存储的日期字符串结构完全对应,注意MM大写代表月份,小写mm代表分钟 final DateFormat dateFormatter = DateFormat('dd-MM-yyyy'); DateTime targetDate = dateFormatter.parse(users[index].date);
场景2:读取到的值为44734类数字型序列号
直接按Excel日期规则转换为DateTime,无需转字符串处理,同时兼容Excel 1900闰年的计算bug:
DateTime convertExcelSerialToDate(num excelSerial) { // Excel日期计算基准,兼容官方1900闰年bug的偏移修正 final DateTime base = DateTime(1899, 12, 30); final int days = excelSerial.floor(); final double dayFraction = excelSerial - days; final Duration timeOffset = Duration( milliseconds: (dayFraction * 24 * 60 * 60 * 1000).round() ); return base.add(Duration(days: days)).add(timeOffset); } // 调用示例 DateTime targetDate = convertExcelSerialToDate(users[index].date); // 传入44734时,转换结果为2022-06-20,和预期日期一致
注意事项
- 读取Excel单元格值时先做类型判断:String类型走DateFormat解析逻辑,num类型走序列号转换逻辑,可覆盖所有日期读取场景。
- 若需要在Excel中以纯文本存储日期,必须先将单元格格式设置为「文本」,再输入日期内容;先输入日期再修改单元格格式,底层存储的仍是数字序列号,无法直接按字符串读取。
内容的提问来源于stack exchange,提问作者Miguel
相关产品推荐
相关产品推荐

