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

Flutter实现指定日期范围结构化数据筛选

Flutter 按指定起止日期范围筛选数据实现方案

核心实现逻辑:由于数据集中date字段为dd/MM/yyyy格式的字符串,无法直接做数值比较,需先将日期字符串解析为DateTime类型,再通过List的where方法做区间匹配,全程保留原始数据集的字段、内容、结构不做任何修改。

实现步骤

  • 编写适配现有日期格式的解析方法,按「日/月/年」的顺序拆分字符串转DateTime,避免解析错位
  • 定义筛选的起止日期,可通过showDateRangePicker控件让用户自主选择,也可传入固定日期值
  • 遍历原始数据集,将每条记录的日期转成DateTime类型后判断是否落在目标区间,返回符合条件的结果集

完整实现代码

// 原始数据集 完全保留原有字段、内容未做任何修改
List<Map<String, dynamic>> rawPaymentData = [
  {
    "date": "21/6/2022",
    "amount": 200,
    "allocation": "allocated",
    "month": "June",
    "year": 2022,
    "paymentcode": "INVGT899",
    "phone": 254704122812,
    "docid": "LJGPV5Lx2shyRmZsdf8L",
    "name": "Adam Jiwawa",
    "userid": "yuWufPcMu9VU6VTX2xrx33XOA323",
    "paymentref": "PAY77293"
  },
  {
    "date": "20/6/2022",
    "amount": 3000,
    "allocation": "allocated",
    "month": "June",
    "paymentcode": "PAY2002",
    "phone": 254704122812,
    "year": 2022,
    "docid": " TM6yPolBTKJNHA4AzTpg",
    "name": "Frank Lyn",
    "userid": "yuWufPcMu9VU6VTX2xrx33XOA323",
    "paymentref": "INV9000"
  },
  {
    "date": "12/10/2022",
    "amount": 20000,
    "allocation": "allocated",
    "phone": 254704122812,
    "paymentcode": "INCV&amp;88s",
    "docid": "joh64rHBqrJbV5WQX4lg",
    "name": "Ruth Wagoa",
    "userid": "38G6mrsvzVNsdyHGDpmlFsDQz733",
    "paymentref": "PDY777888"
  },
  {
    "date": "12/12/2023",
    "allocation": "unallocated",
    "amount": 2000,
    "phone": 254704122812,
    "paymentcode": "203030cD",
    "docid": "kC7MEgRvnQhfwktAo2dI",
    "name": "James Ruponzo",
    "userid": "38G6mrsvzVNsdyHGDpmlFsDQz733",
    "paymentref": "PAy6272"
  }
];

/// 适配dd/MM/yyyy格式的日期解析方法
DateTime parseRecordDate(String dateStr) {
  final dateParts = dateStr.split('/');
  return DateTime(
    int.parse(dateParts[2]), // 年
    int.parse(dateParts[1]), // 月
    int.parse(dateParts[0])  // 日
  );
}

/// 日期范围筛选核心方法
List<Map<String, dynamic>> filterDataByDateRange(DateTime startDate, DateTime endDate) {
  return rawPaymentData.where((record) {
    final recordDate = parseRecordDate(record['date']);
    // 区间判断:包含起止日期当天的所有记录
    return recordDate.isAfter(startDate.subtract(const Duration(days: 1))) 
        && recordDate.isBefore(endDate.add(const Duration(days: 1)));
  }).toList();
}

// 调用示例
void main() {
  // 示例:筛选2022年6月1日 至 2022年10月31日的记录
  final rangeStart = DateTime(2022, 6, 1);
  final rangeEnd = DateTime(2022, 10, 31);
  final filteredResult = filterDataByDateRange(rangeStart, rangeEnd);
  // 输出结果长度为3,自动过滤2023年12月的记录
  print('符合条件的记录数:${filteredResult.length}');
}

注意事项

  • 禁止直接对日期字符串做大小比较:不同长度的月、日数值(如6和10)会导致字符串比较逻辑出错,必须转换为DateTime类型再判断
  • 不要直接调用DateTime.parse解析现有日期字符串:该方法默认适配yyyy-MM-dd格式,直接传入dd/MM/yyyy格式的字符串会抛出解析异常
  • 区间判断时做了±1天的容错处理,避免DateTime默认时间为00:00时,起止日期当天的记录被误过滤
  • 如果需要用户交互选择日期范围,直接调用Flutter内置的showDateRangePicker方法获取用户选择的起止日期,传入筛选方法即可,无需修改其他逻辑
  • 筛选返回的结果完全保留原始数据的所有字段、值和结构,不会改动原有数据内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:33:20