如何过滤 Flutter/Dart 中日期范围(从日期到日期)内的项目?
How to filter items consisting within a Date Range (from dateA to dateB) in Flutter/Dart?
我正在尝试创建一个过滤器,我需要使用一系列日期进行过滤。
例如。从 2021-05-21
到 2021-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
。
我正在尝试创建一个过滤器,我需要使用一系列日期进行过滤。
例如。从 2021-05-21
到 2021-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
。