使用Moment.js筛选15分钟内后端即将到来行程数据失败求助
问题分析与修复方案
核心问题点
- 笔误导致时间范围错误:代码中写的是
moment().add(2, 'minutes'),但需求是筛选15分钟内的行程,这里明显是参数写错了。 - 类型不匹配导致判断失效:
currentTime被格式化为字符串,而fifteenMinutesLater是Moment对象,isBetween方法混合类型比较时会出现逻辑异常,必须统一用Moment实例做比较。 - 区间边界未明确包含:Moment的
isBetween默认是不包含两端时间的,若需要包含当前时间和15分钟后的时间,需指定闭区间参数。
修正后的代码
const fetchUpcomingTrips = () => { let upcomingApiData = getTripsData?.data['upcoming']; if (upcomingApiData) { // 直接保留Moment实例,无需格式化 const currentTime = moment().utc(true); // 修正为15分钟,同时保持UTC时区一致 const fifteenMinutesLater = moment().utc(true).add(15, 'minutes'); console.log(currentTime.format('YYYY-MM-DDTHH:mm:ssZ')); const upcomingTrips = upcomingApiData.filter(trip => { // 直接解析后端的UTC时间字符串,Moment自动识别ISO格式 const rideStartTime = moment(trip?.ride_start_time); // 使用[]指定闭区间,包含当前时间和15分钟后的时间点 return rideStartTime.isBetween(currentTime, fifteenMinutesLater, null, '[]'); }); setUpcomingTrips(upcomingTrips); } };
额外说明
- 调用
utc(true)是为了让Moment实例切换到UTC模式,和后端返回的时区完全对齐,避免本地时区转换带来的误差。 - 若仍有问题,可在filter逻辑中打印
rideStartTime.format()、currentTime.format()、fifteenMinutesLater.format()的值,直观排查时间是否在预期区间内。
内容的提问来源于stack exchange,提问作者Fahad Ali
相关产品推荐
相关产品推荐

