判断日期是否在指定周期的JS函数突然失效,请问是什么原因?
问题根因
- 循环遍历范围错误
你当前的循环条件是i < p.length,但p数组只有10个元素,存储起始/结束日期的s、e数组各有29个元素,等于你只检查了前10个时间周期,后面19个周期完全没有参与校验。 - 年份硬编码为固定值2021
Date.now()返回的是当前系统时间的时间戳,当前时间已经远晚于2021年的所有日期,自然所有校验条件都不满足,只会返回NIR。你手动指定2021年的日期时刚好落在2021年的校验范围内,所以能正常返回结果。 - 跨年日期处理逻辑缺失
s、e数组中包含Jan 2、Jan 1这类跨年的日期,你直接拼接固定年份2021的话,比如周期末尾的Jan 1会被解析为2021年1月1日,时间顺序早于同周期开头的Dec 19 2021,会导致这部分周期的校验逻辑完全失效。 - offset使用无边界校验
匹配到结果后直接用i + offset取对应数组的元素,没有判断下标是否超出数组长度,很容易出现取到undefined的情况。
修复方案
首先把硬编码的年份改为动态获取,其次调整循环范围为s/e数组的长度,再补全跨年日期的年份判断逻辑,最后添加offset的边界校验,参考修复后的代码:
function findPeriod(offset = 0) { const s = ["Aug 29", "Sept 12", "Sept 26", "Oct 10", "Oct 24", "Nov 7", "Nov 21", "Dec 5", "Dec 19", "Jan 2", "Jan 16", "Jan 30", "Feb 13", "Feb 27", "Mar 13", "Mar 27", "Apr 10", "Apr 24", "May 8", "May 22", "Jun 5", "Jun 19", "Jul 3", "Jul 17", "Jul 31", "Aug 14", "Aug 28", "Sept 11", "Sept 25"]; const e = ["Sept 11", "Sept 25", "Oct 9", "Oct 23", "Nov 6", "Nov 20", "Dec 4", "Dec 18", "Jan 1", "Jan 15", "Jan 29", "Feb 12", "Feb 26", "Mar 12", "Mar 26", "Apr 9", "Apr 23", "May 7", "May 21", "Jun 4", "Jun 18", "Jul 2", "Jul 16", "Jul 30", "Aug 13", "Aug 27", "Sept 10", "Sept 24", "Oct 8"]; const p = ["Period 19", "Period 20", "Period 21", "Period 22", "Period 23", "Period 24", "Period 25", "Period 26", "Period 27", "Period 1"]; const d = new Date(); const currentYear = d.getFullYear(); let found = "NIR"; try { // 循环范围改为s数组长度,覆盖所有周期 for (let i = 0; i < s.length; i++) { // 处理跨年日期:1/2月的日期归属到下一年 const startYear = s[i].startsWith("Jan") || s[i].startsWith("Feb") ? currentYear + 1 : currentYear; const endYear = e[i].startsWith("Jan") || e[i].startsWith("Feb") ? currentYear + 1 : currentYear; const startTime = Date.parse(`${s[i]}, ${startYear}`); const endTime = Date.parse(`${e[i]}, ${endYear}`); if (d >= startTime && d <= endTime) { // 校验offset边界,避免下标溢出 const targetIdx = i + offset; if(targetIdx >= 0 && targetIdx < p.length) { const targetStartYear = s[targetIdx].startsWith("Jan") || s[targetIdx].startsWith("Feb") ? currentYear + 1 : currentYear; found = `${p[targetIdx]} ${s[targetIdx]} to ${e[targetIdx]}, ${targetStartYear}`; } break; } } return found; } catch (err) { console.log(err); return "NIR"; } } console.log(findPeriod());
内容的提问来源于stack exchange,提问作者Mike Budgell
相关产品推荐
相关产品推荐

