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

