Итак, я получаю промо-список из API с полем dateStart
и dateEnd
, которое возвращает ГГГГ-ММ-ДД String
или null
, если оно пустое. Теперь я хочу сравнить/отфильтровать.
1- имеет dateStart=ГГГГ-ММ-ДД && имеет dateEnd=ГГГГ-ММ-ДД - можно отображать, но если dateEnd == сегодня или позже, то он не будет отображаться
2- имеет dateStart=ГГГГ-ММ-ДД && имеет dateEnd=null - можно отобразить в списке, так как это может быть промо на всю жизнь
3- показывать в списке только в том случае, если dateStart сегодня или уже прошел
Предположим, это ваш список:
List sampleList = [
{"dateStart": "2022-11-18", "dateEnd": "2022-11-22"},
{"dateStart": "2022-11-20", "dateEnd": "2022-11-20"},
{"dateStart": "2022-10-20", "dateEnd": "2022-11-19"},
{"dateStart": "2022-10-20", "dateEnd": null},
];
поэтому вы можете получить свой список следующим образом:
var result = sampleList.map((e) {
if (e['dateStart'] != null) {
DateTime startDate =
DateFormat("yyyy-MM-dd").parse(e['dateStart'] + ' 23:59');
DateTime? endDate = e['dateEnd'] != null
? DateFormat("yyyy-MM-dd hh:mm").parse(e['dateEnd'] + ' 23:59')
: null;
var now = DateTime.now();
if ((startDate.isBefore(now) || startDate == now) &&
(endDate == null || endDate.isBefore(now))) {
return e;
}
}
}).toList();
result.removeWhere((element) => element == null);
print("result = $result");//result = [{dateStart: 2022-10-20, dateEnd: 2022-11-19}, {dateStart: 2022-10-20, dateEnd: null}]
теперь вы можете использовать result
, чтобы показать свой список.
Я не знаком с флаттером, но заметил несоответствие: DateFormat("yyyy-MM-dd").parse(e['dateStart'] + ' 23:59');
и DateFormat("yyyy-MM-dd hh:mm").parse(e['dateEnd'] + ' 23:59')
e['dateStart'] + ' 23:59'
должно быть e['dateStart'] + ' 00:00'
наверное
@ChristianAbila причина, по которой я добавляю 23:59, заключается в том, что ОП хочет пропустить дату, равную сегодняшнему дню, и когда мы преобразуем «2022-11-20» в формат даты и времени, преобразователь добавляет 00:00, потому что час и минута пусты и в isBefore, поскольку 00 меньше текущего часа, условие не будет работать корректно. Летом я добавляю 23:59, чтобы убедиться, что выбранная дата находится в конце дня, поэтому можно удалить сегодняшнюю дату в функции isBefore.
@OMiShah нет, проверьте комментарий выше.
@eamirho3ein @eamirho3ein, я думаю, вам следует еще раз прочитать вопрос, так как ОП хочет отфильтровать данные по типу 3, как уже упоминалось. Или может быть я не понял :p
@user3352042 user3352042 ты этого хотел?
не могли бы вы добавить образец для вашего списка?