无法正常比较日期(始终返回true/false),如何正确过滤未来时间?
正确比较带时区的时间并过滤未来时间
问题根源
你之前的核心错误在于:
- 将
Date对象转成字符串后进行比较,字符串的字典序和时间先后逻辑不匹配,导致比较结果错误; - 使用
moment()时未对齐时区,服务器返回的是纽约时区(-04:00)的时间,而moment()默认取本地时区时间,若本地时区与纽约不一致,比较逻辑必然出错; forEach无返回值,你将其赋值给newArray的操作完全无效。
方案一:原生JavaScript Date API实现
服务器返回的带时区偏移的时间字符串,原生Date可以直接解析为对应UTC时间的对象,和当前时间的Date对象直接比较(本质是比较毫秒级时间戳)即可:
function getFilteredTimes(timeList) { const now = new Date(); // 当前时间的Date对象(基于UTC时间戳) return timeList.filter(item => { const startTime = new Date(item.startTime); // 解析带时区的时间字符串 return startTime > now; // 直接比较Date对象,判断是否为未来时间 }); }
说明:new Date("2023-07-10T11:15:00-04:00")会自动转换为对应的UTC时间戳,和new Date()的时间戳直接比较,结果完全准确。
方案二:Moment.js实现(适配纽约时区需求)
如果你的需求是按纽约当地时间的“现在”过滤,需要明确对齐时区,避免本地时区干扰:
function getFilteredTimes(timeList) { // 获取纽约时区的当前时间 const nowInNY = moment().tz("America/New_York"); return timeList.filter(item => { // 保留服务器时间的原时区信息,避免转换错误 const startTime = moment.parseZone(item.startTime); // 直接判断时间先后 return startTime.isAfter(nowInNY); }); }
说明:moment.parseZone会保留原时间的时区偏移,moment().tz("America/New_York")获取当前纽约时间的moment对象,两者内部均基于UTC时间戳比较,结果准确。
验证方法
可以打印时间戳确认比较逻辑是否正确:
// 在filter回调中添加 console.log("开始时间戳:", startTime.valueOf(), "当前纽约时间戳:", nowInNY.valueOf());
时间戳数值更大的时间,就是更晚的未来时间。
内容的提问来源于stack exchange,提问作者Usman Khan
相关产品推荐
相关产品推荐

