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

如何在TypeScript中筛选近30天至今日的交易数据?

实现近30天至当前时间的数据筛选过滤器

原代码存在的问题

原代码通过格式化日期字符串再转为Date对象进行比较,会触发日期解析歧义:浏览器默认将DD-MM-YYYY格式的字符串按MM-DD-YYYY解析,导致类似30-05-2023的日期被判定为无效日期,直接破坏筛选逻辑。

优化后的实现代码

// 数据源
dataTtransaction: { 
  dataTransactionOrder: [ 
    { "dateTransaction": "04-04-2023 08:53:14" }, 
    { "dateTransaction": "30-05-2023 08:53:14" }, 
    { "dateTransaction": "01-06-2023 08:53:14" }
  ]
}

// 筛选函数
filterDate(param) {
  // 计算近30天的起始时间(当前时间往前推30天)
  const startDate = moment().subtract(30, 'days');
  // 当前时间作为结束时间
  const endDate = moment();

  this.prodFilter = this.dataTtransaction.dataTransactionOrder.filter(st => {
    // 明确指定日期格式,避免解析错误
    const transactionDate = moment(st.dateTransaction, 'DD-MM-YYYY HH:mm:ss');
    // 判断日期是否在[起始时间, 结束时间]闭区间内
    return transactionDate.isBetween(startDate, endDate, null, '[]');
  });
}

关键优化点

  • 强制日期解析格式:使用moment(st.dateTransaction, 'DD-MM-YYYY HH:mm:ss')明确告知moment日期的结构,彻底避免跨环境解析差异。
  • 直接利用moment比较能力:isBetween方法原生支持区间判断,'[]'参数表示包含起始和结束时间(闭区间),无需手动处理日期转字符串再转对象的冗余操作。
  • 简化日期计算:moment().subtract(30, 'days')直接生成30天前的时间对象,比手动操作Date对象更简洁可靠。

可选调整

  • 如果需要筛选30天前0点至今日0点的数据,可修改起始/结束日期:
    const startDate = moment().subtract(30, 'days').startOf('day');
    const endDate = moment().endOf('day');
    

内容的提问来源于stack exchange,提问作者Arifudin Myf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 19:08:32