如何检查日期数组是否递增?现有JavaScript函数异常求助
解决日期数组递增检查的问题
原代码的错误点
- 每次循环仅转换当前索引的日期,未保存前一个日期的转换结果,根本无法完成前后日期的比较
- 错误地将
Date对象当作数组访问(convertedToDate[i]),这会返回undefined,导致所有比较逻辑完全失效 - 逻辑偏差:原代码要求日期必须比前一天大1天,但需求仅需日期递增排列即可,不需要连续(比如
['12/12/2023', '14/12/2023']也应返回true) - 未处理日期格式问题:
new Date('dd/mm/yyyy')在JavaScript中会被默认按mm/dd/yyyy解析,遇到13/12/2023这类日期会直接变成无效日期,导致判断错误
正确实现方案
首先手动解析dd/mm/yyyy格式的日期,避免JS默认解析的坑,再逐一比较前后日期的大小:
// 辅助函数:将dd/mm/yyyy格式的字符串转换为标准Date对象 function parseDMY(dateStr) { const [day, month, year] = dateStr.split('/').map(Number); // JS的月份是0-based,所以要减1 return new Date(year, month - 1, day); } function isIncreasing(dates) { // 空数组或单个元素的数组直接判定为递增 if (dates.length <= 1) return true; let prevDate = parseDMY(dates[0]); // 检查第一个日期是否有效 if (isNaN(prevDate.getTime())) { throw new Error(`无效日期格式: ${dates[0]}`); } for (let i = 1; i < dates.length; i++) { const currDate = parseDMY(dates[i]); // 检查当前日期是否有效 if (isNaN(currDate.getTime())) { throw new Error(`无效日期格式: ${dates[i]}`); } // 当前日期小于等于前一个,直接返回false if (currDate <= prevDate) { return false; } prevDate = currDate; } return true; } // 测试用例 console.log(isIncreasing(['12/12/2023','13/12/2023'])); // true console.log(isIncreasing(['12/12/2023','11/12/2023'])); // false console.log(isIncreasing(['12/12/2023','11/12/2023','10/12/2023'])); // false console.log(isIncreasing(['12/12/2023','14/12/2023','15/12/2023'])); // true
关键说明
- 手动解析日期:通过
split('/')拆分日、月、年,再传入Date构造函数,避免默认解析的格式错误 - 有效性校验:用
isNaN(date.getTime())判断日期是否合法,防止无效格式干扰判断逻辑 - 递增判断:只需确保当前日期严格大于前一个日期,无需限制为连续的一天
内容的提问来源于stack exchange,提问作者Alom
相关产品推荐
相关产品推荐

