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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:53:20