如何实现从当前日期开始的未来日期由远及近排序并过滤过往日期
解决方案
要实现保留当前日期及之后的条目,并按需求排序,需要分两步处理:先过滤掉已过去的日期,再修正排序逻辑(原函数直接比较日期字符串存在格式解析风险)。
1. 处理日期格式兼容问题
如果你的日期字符串是DD/MM/YYYY格式,直接用new Date()解析可能出错(JS默认优先识别MM/DD/YYYY),所以需要先转换成标准的YYYY-MM-DD格式来确保解析正确:
const parseDate = (dateStr) => { const [day, month, year] = dateStr.split('/'); // 返回对应日期的时间戳(当天0点整) return new Date(`${year}-${month}-${day}`).getTime(); };
2. 过滤过往日期
先获取当前日期的起始时间(当天00:00:00),避免因当前时间(比如下午)误过滤掉当天的条目,然后筛选出日期大于等于该时间的条目:
const filterFutureDates = (items) => { const todayStart = new Date(); todayStart.setHours(0, 0, 0, 0); const todayTimestamp = todayStart.getTime(); return items.filter(item => { const itemTimestamp = parseDate(item.date); return itemTimestamp >= todayTimestamp; }); };
3. 修正排序函数
原函数直接比较字符串日期存在格式错误,改用时间戳比较,实现两种排序需求:
- 由近及远排序(最近的未来日期在前,即你示例中的顺序):
const sortBySoonestDate = (a, b) => { const timestampA = parseDate(a.date); const timestampB = parseDate(b.date); return timestampA - timestampB; };
- 由远及近排序(最远的未来日期在前):
const sortByFurthestDate = (a, b) => { const timestampA = parseDate(a.date); const timestampB = parseDate(b.date); return timestampB - timestampA; };
4. 组合使用
把过滤和排序逻辑结合,直接处理原始数据:
const processDates = (items) => { const futureItems = filterFutureDates(items); // 按需选择排序函数:sortBySoonestDate 或 sortByFurthestDate return futureItems.sort(sortBySoonestDate); };
示例验证
假设输入数据:
const items = [ { date: "11/09/2023" }, { date: "14/09/2023" }, { date: "12/09/2023" }, { date: "15/09/2023" } ]; // 当前日期为2023年9月13日时,执行后得到: // [{ date: "14/09/2023" }, { date: "15/09/2023" }] console.log(processDates(items));
内容的提问来源于stack exchange,提问作者Zerkley
相关产品推荐
相关产品推荐

