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

Flutter中DateTime.parse触发FormatException的原因排查

异常原因分析

核心问题:DateTime.parse不支持带AM/PM的自定义日期格式

Dart的DateTime.parse()方法仅能解析符合ISO 8601标准的日期字符串(比如"2022-10-07T06:04:00"),而你传入的"2022-10-07 06:04 AM"属于带12小时制标识(AM/PM)的自定义格式,不在DateTime.parse()的支持范围内,因此直接调用会抛出FormatException。

原函数的额外问题

你的函数存在冗余且不合理的逻辑:

  • 先把当前时间转成格式化字符串,再把目标时间转成同格式字符串,通过字符串比较判断时间先后。这种方式不仅效率低,还可能因为区域设置差异导致错误。
  • 直接比较DateTime对象本身才是更简洁可靠的方式,无需转成字符串。

修复方案

使用intl包中的DateFormat来解析带AM/PM的日期字符串,然后直接比较DateTime对象:

import 'package:intl/intl.dart';

bool isUpcomingCurrentTimeIsAfter(String strDateToCompare) {
  DateTime now = DateTime.now();
  // 用对应格式解析目标日期字符串
  DateFormat format = DateFormat('yyyy-MM-dd hh:mm a');
  DateTime targetDate = format.parse(strDateToCompare);
  
  // 直接比较DateTime对象:当前时间早于等于目标时间则返回true
  return now.isBefore(targetDate) || now.isAtSameMomentAs(targetDate);
}

说明:

  • hh代表12小时制的小时(如果输入是24小时制则用HH)
  • 直接使用DateTime的isBefore、isAtSameMomentAs方法判断时间关系,逻辑清晰且准确

内容的提问来源于stack exchange,提问作者Jaimin Modi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:01:35