如何过滤 Flutter/Dart 中日期范围(从日期到日期)内的项目?

How to filter items consisting within a Date Range (from dateA to dateB) in Flutter/Dart?

我正在尝试创建一个过滤器,我需要使用一系列日期进行过滤。

例如。从 2021-05-212021-08-31 。 我得到 dateA = 2021-05-21, dateB = 2021-08-31.

假设我在下面分别有一个日期列表和项目列表:

日期格式为yyyy-mm-dd

datesList =

[ "2021-05-07", 
"2021-06-09", //
"2021-05-12", 
"2021-08-12", // 
"2021-04-15", 
"2021-07-08", // 
"2021-05-02",
"2021-06-31", // 
"2021-08-18", // 
"2021-02-09" ] 

itemsList =

[ "Apple", 
"Mango",        // 
"Apple", 
"Pineapple,     // 
"Cinnamon", 
"Apple",        // 
"Mango",
"Banana",       // 
"Orange",       // 
"Orange" ]

注意:此处,对于 datesList 中的第一个元素,例如。 "2021-05-07",相应的项目是 itemsList 中的第一项,即 "Apple"。即两者都具有相同的索引,并且两个列表也具有相同数量的元素。

如何只查找特定日期范围内的项目?

假设我需要从 2021-05-21 过滤到 2021-08-31

那么我应该只从 itemsList 中得到 itemList[2]itemList[4]itemList[6]itemList[8]itemList[9] 作为输出。 这基本上是 ["Mango", "Pineapple", "Apple", "Banana", "Orange"]

因为只有这些项目出现在这个日期范围内,所以需要进行过滤。 (dateA = 2021-05-21, dateB = 2021-08-31.)

我什至无法开始,因为我是 Flutter/Dart 的新手。

请建议我继续。

请参阅 了解如何将日期字符串解析为 DateTime 对象。这样,您就可以遍历列表,将每个解析的 DateTime 与您的开始日期和结束日期进行比较,然后将相应的项目添加到结果列表中。

例如:

import 'package:intl/intl.dart';

/// Returns a list of items that have corresponding dates between [start]
/// and [end] (inclusive).
List<String> itemsBetweenDates({
  required List<String> dates,
  required List<String> items,
  required DateTime start,
  required DateTime end,
}) {
  assert(dates.length == items.length);

  var dateFormat = DateFormat('y-MM-dd');

  var output = <String>[];
  for (var i = 0; i < dates.length; i += 1) {
    var date = dateFormat.parse(dates[i], true);
    if (date.compareTo(start) >= 0 && date.compareTo(end) <= 0) {
      output.add(items[i]);
    }
  }
  return output;
}

void main() {
  var startDate = DateTime.utc(2021, 05, 21);
  var endDate = DateTime.utc(2021, 08, 31);

  var datesList = [
    "2021-05-07",
    "2021-06-09", //
    "2021-05-12",
    "2021-08-12", //
    "2021-04-15",
    "2021-07-08", //
    "2021-05-02",
    "2021-06-31", //
    "2021-08-18", //
    "2021-02-09",
  ];

  var itemsList = [
    "Apple",
    "Mango", //
    "Apple",
    "Pineapple", //
    "Cinnamon",
    "Apple", //
    "Mango",
    "Banana", //
    "Orange", //
    "Orange",
  ];

  print(itemsBetweenDates(
      dates: datesList, items: itemsList, start: startDate, end: endDate));
}

请注意,以上假定开始日期和结束日期包含。例如,如果您希望结束日期不重复,请将 date.compareTo(end) <= 0 更改为 date.compareTo(end) < 0