如何在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
相关产品推荐
相关产品推荐

