Flutter 如何筛选处于指定起止日期区间内的数组数据
Flutter 按时间区间筛选数据实现方案
核心逻辑:先从data1中取出起止时间并转为DateTime类型,再遍历data2将每条数据的eventDate也转为DateTime,判断是否落在起止时间区间内即可。
1. 定义数据模型
首先为两组数据创建Dart模型类,方便JSON解析和后续操作:
// data1对应的行程模型 class TripItem { final String tripType; final DateTime dateStart; final DateTime dateEnd; // 经纬度等其他字段按需添加即可 TripItem({ required this.tripType, required this.dateStart, required this.dateEnd, }); factory TripItem.fromJson(Map<String, dynamic> json) { return TripItem( tripType: json['tripType'], dateStart: DateTime.parse(json['dateStart']), dateEnd: DateTime.parse(json['dateEnd']), ); } } // data2对应的事件模型 class EventItem { final String id; final DateTime eventDate; final String eventClass; final String eventType; // 创建时间、修改时间等其他字段按需添加即可 EventItem({ required this.id, required this.eventDate, required this.eventClass, required this.eventType, }); factory EventItem.fromJson(Map<String, dynamic> json) { return EventItem( id: json['id'], eventDate: DateTime.parse(json['eventDate']), eventClass: json['eventClass'], eventType: json['eventType'], ); } }
2. 实现筛选逻辑
void main() { // 示例data1 JSON数据 final List<Map<String, dynamic>> data1Json = [ { "tripType": "active", "dateStart": "2021-05-31T03:02:38.000Z", "dateEnd": "2021-05-31T03:51:33.000Z", "start": {"lon": 66.975478, "lat": 24.949758,}, "end": {"lon": 67.036706, "lat": 24.827635,} } ]; // 示例data2 JSON数据 final List<Map<String, dynamic>> data2Json = [ { "id": "3cec02d7-4938-418a-bcdd-c6043154a966", "eventDate": "2021-06-01T15:54:01.000Z", "creationDate": "2021-06-01T15:54:06.000Z", "modifiedDate": "2021-06-01T15:54:06.000Z", "eventClass": "overspeedevent", "eventType": "start", }, { "id": "3cec02d7-4938-418a-bcdd-c6043154a966", "eventDate": "2021-07-01T13:54:01.000Z", "creationDate": "2021-06-01T13:54:06.000Z", "modifiedDate": "2021-06-01T13:54:06.000Z", "eventClass": "overspeedevent", "eventType": "end", }, { "id": "3cec02d7-4938-418a-bcdd-c6043154a966", "eventDate": "2021-06-01T15:54:01.000Z", "creationDate": "2021-06-01T15:54:06.000Z", "modifiedDate": "2021-06-01T15:54:06.000Z", "eventClass": "overspeedevent", "eventType": "start", } ]; // 步骤1:解析data1,获取时间区间 final TripItem trip = TripItem.fromJson(data1Json.first); final DateTime startTime = trip.dateStart; final DateTime endTime = trip.dateEnd; // 步骤2:解析data2 final List<EventItem> allEvents = data2Json.map((e) => EventItem.fromJson(e)).toList(); // 步骤3:筛选符合时间区间的事件,此处为闭区间(包含起止时间点) final List<EventItem> filteredEvents = allEvents.where((event) { return event.eventDate.isAfter(startTime) && event.eventDate.isBefore(endTime) // 以下两行用于支持包含起止时间点,不需要开区间可删除 || event.eventDate.isAtSameMomentAs(startTime) || event.eventDate.isAtSameMomentAs(endTime); }).toList(); // 示例中data2的事件时间都不在data1的时间区间内,因此输出长度为0 print("筛选后符合条件的事件数量:${filteredEvents.length}"); }
注意事项
- 时间字符串必须符合ISO8601格式,示例中的时间格式可直接用
DateTime.parse解析 - 若需要开区间筛选,删除
isAtSameMomentAs相关的两行判断即可 - 如果data1存在多条数据,可自行调整时间区间的选取逻辑(如取所有data1的最大/最小时间,或按行程分别筛选)
内容的提问来源于stack exchange,提问作者rameez khan
相关产品推荐
相关产品推荐

