如何判断DateTime大小?Firebase日期区间查询问题求助
如何判断两个DateTime哪个更大或更小?
在Dart里,DateTime类型本身就支持直观的大小比较,常用的方式有两种:
- 实例方法判断:
isAfter(DateTime other):检查当前时间是否在目标时间之后isBefore(DateTime other):检查当前时间是否在目标时间之前isAtSameMomentAs(DateTime other):检查两个时间是否完全一致(精确到微秒)
- 直接用比较运算符:和数字比较逻辑一致,可使用
>、<、>=、<=、==进行判断
举个简单的示例:
DateTime date1 = DateTime(2020, 4, 1); DateTime date2 = DateTime(2020, 4, 5); print(date1.isBefore(date2)); // 输出 true print(date2 > date1); // 输出 true print(date1.isAtSameMomentAs(DateTime(2020,4,1))); // 输出 true
实现当前日期处于指定时间区间的判断(Firebase时间戳场景)
你的核心需求是确认当前时间处于timestampValidFrom(2020-04-01)和timestampValidTo(2020-04-05)之间(包含边界),不管是数据库查询还是前端代码判断,核心逻辑都是当前时间 ≥ validFrom 且 当前时间 ≤ validTo,下面给出正确的实现方案:
1. Firebase数据库查询的正确写法
你之前的查询条件写反了,正确的查询应该筛选出timestampValidFrom不晚于当前时间,且timestampValidTo不早于当前时间的文档:
FirebaseFirestore.instance .collection('你的集合名称') .where('timestampValidFrom', isLessThanOrEqualTo: Timestamp.now()) .where('timestampValidTo', isGreaterThanOrEqualTo: Timestamp.now()) .get();
逻辑解释:只有当有效起始时间不晚于现在,且有效结束时间不早于现在时,当前时间才处于有效区间内。
2. 前端Dart代码的正确判断逻辑
你之前的代码存在逻辑混乱问题(运算符优先级未处理、条件逻辑错误),根据不同需求场景,给出两种实现:
场景一:判断当前精确时刻是否在有效区间内
如果需要精确到时分秒的判断,比如当前14:30是否在有效期内:
// 获取当前精确时间 DateTime now = DateTime.now(); // 将Firebase时间戳转换为DateTime类型 DateTime validFrom = snapshot.data[index].timestampValidFrom.toDate(); DateTime validTo = snapshot.data[index].timestampValidTo.toDate(); // 判断当前时刻是否处于[validFrom, validTo]区间(包含边界) bool isInRange = (now.isAfter(validFrom) || now.isAtSameMomentAs(validFrom)) && (now.isBefore(validTo) || now.isAtSameMomentAs(validTo)); if (isInRange) { // 显示目标Widget } else { // 显示空Widget }
场景二:判断当前自然日是否在有效区间内
如果需求是只要当天属于有效期就显示(比如只要是4月3日,不管几点都符合条件):
DateTime now = DateTime.now(); // 当天的起始时刻(00:00:00) DateTime startOfToday = DateTime(now.year, now.month, now.day); // 当天结束时刻的下一秒(次日00:00:00,用于区间比较) DateTime endOfToday = startOfToday.add(const Duration(days: 1)); DateTime validFrom = snapshot.data[index].timestampValidFrom.toDate(); DateTime validTo = snapshot.data[index].timestampValidTo.toDate(); // 判断当天与有效区间是否有重叠(即当天属于有效期) bool isTodayInRange = startOfToday.isBefore(validTo) && endOfToday.isAfter(validFrom); if (isTodayInRange) { // 显示目标Widget } else { // 显示空Widget }
内容的提问来源于stack exchange,提问作者BIS Tech
相关产品推荐
相关产品推荐

