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

Dart中如何从Map中筛选指定一周日期范围的事件?

一周事件筛选实现方案

首先明确:无法直接通过Map的[]操作符获取一周范围内的事件,因为[]操作符只能匹配与key完全相等的DateTime,而你需要的是一个日期范围,不是单个精确日期。

要筛选一周内的所有事件,需要先确定一周的起止日期,再遍历Map的所有key,筛选出落在该范围内的日期,最后合并对应事件列表。

步骤1:确定一周的起止日期

根据需求定义一周的范围,比如两种常见场景:

  • 以选中日期为起点,往后推6天(共7天):
// 仅保留选中日期的年月日,和你的Event Map的key格式对齐
final startOfWeek = DateTime(_selectedDate.year, _selectedDate.month, _selectedDate.day);
// 一周的最后一天(起点加6天)
final endOfWeek = startOfWeek.add(const Duration(days: 6));
  • 以选中日期所在周的周一为起点,周日为终点:
// 调整到本周一(若选中日期是周一则不变,否则往前推至周一)
final startOfWeek = _selectedDate.subtract(Duration(days: _selectedDate.weekday - 1));
// 本周日(周一加6天)
final endOfWeek = startOfWeek.add(const Duration(days: 6));

步骤2:筛选并合并一周内的事件

通过遍历Map的条目,筛选出日期在范围内的事件,再合并成一个列表:

// 简洁写法:用entries遍历+where筛选+expand合并列表
List<CleanCalendarEvent> _weeklyEvents = widget.events?.entries
    .where((entry) => 
        // 确保日期在[startOfWeek, endOfWeek]区间内
        entry.key.isAfter(startOfWeek.subtract(const Duration(days: 1))) && 
        entry.key.isBefore(endOfWeek.add(const Duration(days: 1))))
    .expand((entry) => entry.value) // 将每个日期的事件列表展开成单个元素
    .toList() ?? [];

或者用forEach的写法,逻辑更直观:

List<CleanCalendarEvent> _weeklyEvents = [];
if (widget.events != null) {
  widget.events!.forEach((date, events) {
    if (date.isAfter(startOfWeek.subtract(const Duration(days: 1))) && 
        date.isBefore(endOfWeek.add(const Duration(days: 1)))) {
      _weeklyEvents.addAll(events);
    }
  });
}

注意事项

  • 确保你的Map中存储的DateTime key仅包含年月日(时分秒为0),否则日期比较可能出现偏差。如果key包含时分秒,需要先将其转换为仅保留年月日的格式再进行比较。
  • 日期判断时使用subtract(Duration(days:1))和add(Duration(days:1)),是为了避免因DateTime的时分秒差异导致的判断错误,确保当天的日期能被正确识别。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:31:24