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
相关产品推荐
相关产品推荐

