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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 19:54:03