#flutter #date #dart #range
Вопрос:
Я хочу получить строки таблицы данных на основе даты начала и даты окончания.
Предположим, моя дата начала — «2015-09-08», а дата окончания — «2015-10-08».
Основываясь на этих датах, я хочу, чтобы строки таблицы данных использовали flutter. Мне нужны даты между датой начала и датой окончания, используя приведенный ниже список.
final List<UserView> _usersViewData = [
UserView(
date: '2021-08-01', //yyyy-mm-dd
description: 'Product Ordered',
amount: 1002.00,
status: '0'),
UserView(
date: '2021-08-10',
description: 'Product Ordered',
amount: 890.12,
status: '1'),
UserView(
date: '2021-09-04',
description: 'Product Ordered',
amount: 189.14,
status: '0')..........];
late DateTime from = DateTime.now();
late DateTime to = DateTime.now();
Future<void> _selectDate(BuildContext context, int i) async {
final DateTime? pickedDate = await showDatePicker(
context: context,
initialDate: DateTime.now(),
firstDate: DateTime(2015),
lastDate: DateTime(2050));
if (pickedDate != null) {
if (i == 0) {
setState(() {
from = pickedDate;
});
} else if (i == 1) {
setState(() {
to = pickedDate;
});
}
}
}
Я хочу получить список строк на основе даты начала и даты окончания, используя приведенный выше список просмотра пользователем.
Я перепробовал много вещей, таких как
final int difference = from.difference(to).inDays;
//and also tried compare
_usersViewData.sort((a, b) => a.date.compareTo(b.date));
Я хочу получить список строк на основе даты начала и даты окончания, используя приведенный выше список просмотра пользователем.
Ответ №1:
Вы можете использовать методы класса DateTime и метод where для достижения этой цели:
final views = _usersViewData.where((user) {
final currentDate = DateTime.tryParse(user.date);
return currentDate != null
amp;amp; (currentDate.isAfter(from) || currentDate.isAtSameMomentAs(from))
amp;amp; (currentDate.isBefore(to) || currentDate.isAtSameMomentAs(to));
}).toList();
Комментарии:
1. что делать, если текущая дата и дата начала совпадают ?
2. Текущая дата.после(дата начала.вычесть(постоянная продолжительность(дней: 1))) amp; amp; Текущая дата.До(дата окончания.добавить(постоянная продолжительность(дней: 1)));
Ответ №2:
Используйте следующий код для фильтрации списка по заданному диапазону. to
и from
DateTime
объекты, инициализированные с помощью средства выбора даты.
List<UserView> temp = list.where((obj){
return DateTime.parse(obj.date).compareTo(from) >= 0 amp;amp;
DateTime.parse(obj.date).compareTo(to) <=0;
}).toList();
Сравнивает этот объект DateTime с [другим], возвращая ноль, если значения равны.
Возвращает отрицательное значение, если эта дата-время [до] [другое]. Он возвращает 0, если это [isAtSameMomentAs] [другое], и возвращает положительное значение в противном случае (когда это [после] [другое]).