在JavaScript/TypeScript中实现日期区间过滤失败问题求助
嘿,我懂你遇到的坑了!直接用字符串比较DD.MM.YYYY格式的日期根本行不通,因为字符串是按从左到右的字符顺序对比的,完全不遵循实际的日期逻辑。举个例子,你看"31.07.2020"这个日期,作为字符串它的第一个字符是"3",比你的结束日期"18.08.2020"的第一个字符"1"大,所以字符串比较会错误地认为"31.07.2020" > "18.08.2020",直接把这个日期的数据过滤掉——这就是为什么你只能拿到首尾两个日期的数据,中间很多符合条件的日期都因为字符串顺序不符合被排除了。
下面给你两个靠谱的解决方案,任选其一就行:
方案1:转成Date对象比较
先把DD.MM.YYYY格式的字符串拆分成日、月、年,再创建合法的Date对象,通过时间戳来比较:
const startDateStr = "01.07.2020"; const endDateStr = "18.08.2020"; // 辅助函数:把DD.MM.YYYY字符串转成Date对象 const parseDMYToDate = (dateStr: string): Date => { const [day, month, year] = dateStr.split(".").map(Number); // 注意:Date的月份是从0开始计数的,所以要减1 return new Date(year, month - 1, day); }; const startDate = parseDMYToDate(startDateStr); const endDate = parseDMYToDate(endDateStr); this.Detaileddata = this.Detaileddata.filter((item) => { const itemDate = parseDMYToDate(item.date); // 用getTime()获取时间戳来比较,避免时区带来的微小差异 return itemDate.getTime() >= startDate.getTime() && itemDate.getTime() <= endDate.getTime(); }); console.log("result", this.Detaileddata);
方案2:转成YYYYMMDD数字比较
如果不想处理Date对象的时区问题(虽然这里只关心年月日,影响不大),可以把日期转成纯数字格式,比如20200701,直接比较数字大小更直观:
const startDateStr = "01.07.2020"; const endDateStr = "18.08.2020"; // 辅助函数:把DD.MM.YYYY字符串转成YYYYMMDD数字 const convertDMYToNumber = (dateStr: string): number => { const [day, month, year] = dateStr.split("."); // 拼接成年月日的数字,比如"01.07.2020" → 20200701 return Number(`${year}${month}${day}`); }; const startDateNum = convertDMYToNumber(startDateStr); const endDateNum = convertDMYToNumber(endDateStr); this.Detaileddata = this.Detaileddata.filter((item) => { const itemDateNum = convertDMYToNumber(item.date); return itemDateNum >= startDateNum && itemDateNum <= endDateNum; }); console.log("result", this.Detaileddata);
小提醒:
要确保所有item.date的格式都是严格的DD.MM.YYYY,比如月份和日期必须是两位数字(7月要写成"07"而不是"7"),否则转换会出错。如果有格式不规范的情况,得先做格式校验或者预处理哦。
内容的提问来源于stack exchange,提问作者karthikeyan
相关产品推荐
相关产品推荐

