You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 07:01:10