如何使用moment计算最近3、7、30、90天的订单总金额之和
订单多时间区间金额统计实现方案
实现思路
- 提前计算4个统计区间的起始时间,避免循环内重复计算提升性能
- 遍历订单时先把
created_at转为moment可识别的时间对象,过滤非法数据后按区间归属累加金额 - 用到的moment核心API:
subtract()计算时间偏移量、isSameOrAfter()判断时间是否在区间范围内
完整实现代码
// 需先按项目环境引入moment库,Node环境引入示例:const moment = require('moment') const getIntervalsSum = (orders) => { var threeDaysSum = 0; var sevenDaysSum = 0; var thirtyDaysSum = 0; var ninetyDaysSum = 0; const now = moment(); // 计算各区间起始时间,clone是为了避免修改原moment对象 // 若需要按自然日统计(从当日0点开始算),可在每个subtract后加.startOf('day') const threeDaysAgo = now.clone().subtract(3, 'days'); const sevenDaysAgo = now.clone().subtract(7, 'days'); const thirtyDaysAgo = now.clone().subtract(30, 'days'); const ninetyDaysAgo = now.clone().subtract(90, 'days'); for(var i=0; i<orders.length;i++) { const order = orders[i]; // 转为moment时间对象,特殊格式可传第二个参数指定,比如moment(order.created_at, 'YYYY-MM-DD HH:mm:ss') const orderTime = moment(order.created_at); // 跳过时间格式非法的订单 if (!orderTime.isValid()) continue; // 兼容金额非数字的脏数据 const amount = Number(order.total) || 0; if(orderTime.isSameOrAfter(threeDaysAgo)) { threeDaysSum += amount; } if(orderTime.isSameOrAfter(sevenDaysAgo)) { sevenDaysSum += amount; } if(orderTime.isSameOrAfter(thirtyDaysAgo)) { thirtyDaysSum += amount; } if(orderTime.isSameOrAfter(ninetyDaysAgo)) { ninetyDaysSum += amount; } } // 返回各区间统计结果 return { threeDaysSum, sevenDaysSum, thirtyDaysSum, ninetyDaysSum } };
内容的提问来源于stack exchange,提问作者gabogabans
相关产品推荐
相关产品推荐

