Dart DateFormat解析日期字符串报错:无法在位置8读取MM
解决Dart中DateFormat解析日期字符串的FormatException问题
问题分析
报错FormatException: Trying to read MM from 20240716 154138 at 8说明解析器在字符串第8位(空格位置)尝试读取月份(MM),意味着格式匹配逻辑未正确识别前8位的日期部分,可能是默认区域设置干扰、严格解析规则限制或字符串存在隐藏异常字符导致。
解决方案
1. 指定明确的区域设置
DateFormat默认使用系统locale,部分locale的日期格式规则会干扰解析,指定通用locale(如en_US)可规避问题:
import 'package:intl/intl.dart'; void main() { String timestampStr = '20240716 154138'; final format = DateFormat('yyyyMMdd HHmmss', 'en_US'); final timestamp = format.parse(timestampStr); print(timestamp); // 输出: 2024-07-16 15:41:38.000 }
2. 使用宽松解析模式
若字符串存在微小格式差异(如空格类型问题),parseLoose比严格的parse更灵活:
import 'package:intl/intl.dart'; void main() { String timestampStr = '20240716 154138'; final timestamp = DateFormat('yyyyMMdd HHmmss').parseLoose(timestampStr); print(timestamp); }
3. 验证字符串完整性
检查字符串是否含隐藏异常字符(如全角空格):
void main() { String timestampStr = '20240716 154138'; print('字符串长度: ${timestampStr.length}'); // 正常应为15 // 逐个打印字符ASCII码 for (int i = 0; i < timestampStr.length; i++) { print('位置$i: ${timestampStr[i]} (ASCII: ${timestampStr.codeUnitAt(i)})'); } }
若空格ASCII码不是32(半角空格),需替换为半角空格:
timestampStr = timestampStr.replaceAll(' ', ' '); // 替换全角空格为半角
4. 升级intl包版本
旧版本intl包可能存在解析bug,在pubspec.yaml中指定最新稳定版:
dependencies: intl: ^0.19.0
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

