Flutter(Dart)中如何用IF条件比较DateTime值?解决时间对比失效问题
解决Dart中时间判断条件不生效的问题
我太懂这种踩坑的感觉了——用字符串对比时间本来就容易出问题,之前的条件不生效完全是因为用错了对比方式!咱们换个靠谱的思路,直接操作DateTime对象来做时间判断就对了。
问题根源
你之前把当前时间转成字符串formattedtime,再和数据库里的time字符串做相等判断,这种方式有两个硬伤:
- 字符串是按字符顺序逐位对比的,哪怕格式有一丁点差异(比如AM/PM大小写、有没有前导零),都会导致判断不相等。
- 你真正需要的是「当前时间≥目标时间」,而不是字符串完全匹配,字符串对比根本满足不了这个逻辑。
正确实现方案
核心原则:别用字符串比时间,直接用DateTime对象做时间对比。根据你数据库的存储格式,分两种情况处理:
情况1:数据库存的是「日期+时分」的格式(可组合成完整时间)
假设数据库里的date是yyyy-MM-dd格式(比如2024-05-20),time是HH:mm格式(比如22:15),直接组合成完整DateTime对比即可:
// 1. 把数据库的日期和时间拼接成目标DateTime DateTime targetDateTime = DateTime.parse("$date $time"); // 2. 获取当前时间 DateTime now = DateTime.now(); // 3. 执行条件判断:日期匹配 + 当前时间≥目标时间 + status为false if (date == formattedDate && (now.isAfter(targetDateTime) || now.isAtSameMomentAs(targetDateTime)) && status == 'false') { // 这里执行你的任务逻辑 } else { // 提示错误 }
情况2:数据库存的是带AM/PM的12小时制时间(比如10:15 PM)
先用DateFormat把时间字符串解析成DateTime,再替换到当前日期上:
import 'package:intl/intl.dart'; // 1. 获取当前时间 DateTime now = DateTime.now(); // 2. 解析数据库里的12小时制时间字符串 DateFormat timeFormatter = DateFormat('h:mm a'); DateTime targetTimePart = timeFormatter.parse(time); // 3. 把解析出的时分替换到当前日期,得到完整的目标DateTime DateTime targetDateTime = DateTime( now.year, now.month, now.day, targetTimePart.hour, targetTimePart.minute ); // 4. 执行条件判断 if (date == formattedDate && (now.isAfter(targetDateTime) || now.isAtSameMomentAs(targetDateTime)) && status == 'false') { // 执行任务 } else { // 提示错误 }
额外提醒
- 解析时间时,格式必须和数据库存储的完全一致,比如数据库是小写
am/pm,解析时就别用大写AM/PM。 - 如果目标时间是跨天的(比如第二天的00:30),记得对应的
date也要是第二天的日期,不然会出现时间判断错误。
内容的提问来源于stack exchange,提问作者Gnziet
相关产品推荐
相关产品推荐

