Flutter:如何按dateStart和dateEnd过滤API返回的Promo List
过滤促销列表的实现方案
规则明确
先把需要遵循的过滤规则拆解清晰:
- 基础准入条件:仅保留
dateStart为今日或早于今日(已过期)的促销条目 - 附加生效条件(满足其一即可):
- 同时存在
dateStart和dateEnd时,dateEnd不得早于今日(未过期) - 存在
dateStart但dateEnd为null,视为终身促销直接保留
- 同时存在
代码实现(JavaScript示例)
先写一个辅助函数处理日期解析,避免时区偏差,再实现过滤逻辑:
// 辅助函数:将YYYY-MM-DD字符串转为UTC起始时间的Date对象,null则返回null function parseUtcDate(dateStr) { if (!dateStr) return null; return new Date(`${dateStr}T00:00:00Z`); } // 获取今日的UTC起始时间,统一判断基准 const todayUtcStart = new Date(); todayUtcStart.setUTCHours(0, 0, 0, 0); // 过滤促销列表的核心函数 function filterValidPromos(promoList) { return promoList.filter(promo => { const startDate = parseUtcDate(promo.dateStart); const endDate = parseUtcDate(promo.dateEnd); // 先检查基础条件:dateStart必须有效且不晚于今日 if (!startDate || startDate > todayUtcStart) { return false; } // 终身促销:dateEnd为null时直接保留 if (!endDate) { return true; } // 有结束日期的促销:结束日期不早于今日才保留 return endDate >= todayUtcStart; }); }
注意事项
- 时区问题:使用UTC时间做统一判断,避免不同时区下“今日”的定义偏差导致过滤错误
- 空值校验:严格判断
dateStart的有效性,排除null或无效日期字符串的条目 - 逻辑顺序:先判断基础准入条件,再处理附加规则,减少不必要的计算
内容的提问来源于stack exchange,提问作者user3352042
相关产品推荐
相关产品推荐

