Как я могу получить строки таблицы данных от даты начала до даты окончания из списка?

#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] [другое], и возвращает положительное значение в противном случае (когда это [после] [другое]).