JavaScript如何检测指定格式日期是否处于另一日期的最近X天范围内
日期范围判断工具函数实现方案
函数命名优化
你原来的isWithinTheLastDays可以简化为isDateWithinLastDays,语义更清晰也更简洁。
实现思路
- 先解决
yyyy.m.d格式的日期解析问题,手动拆分年月日构造Date对象,避免不同环境下日期解析的兼容性问题 - 所有日期统一转换为当日0点的时间戳,消除时间部分的干扰,保证自然日判断的准确性
- 使用Date原生的
setDate方法计算基准日期往前推N天的日期,自动处理跨月、闰年、夏令时等边界情况,不需要手动处理复杂的日历逻辑
完整代码实现
/** * 判断目标日期是否处于基准日期的最近X天范围内(默认包含基准日当天) * @param {string} baseDateStr 基准日期,格式为yyyy.m.d * @param {string} targetDateStr 待判断的目标日期,格式为yyyy.m.d * @param {number} days 最近X天的天数,需为正整数 * @returns {boolean} 是否在范围内 */ function isDateWithinLastDays(baseDateStr, targetDateStr, days) { // 辅助函数:解析yyyy.m.d格式的日期为当日0点的Date对象 const parseCustomDate = (dateStr) => { const [year, month, day] = dateStr.split('.').map(Number) // 月份从0开始计数,所以要减1 const date = new Date(year, month - 1, day) // 校验日期合法性 if (date.getFullYear() !== year || date.getMonth() !== month - 1 || date.getDate() !== day) { throw new Error(`无效的日期格式:${dateStr},请使用yyyy.m.d格式`) } return date } // 参数合法性校验 if (!Number.isInteger(days) || days <= 0) { throw new Error('days参数必须为正整数') } const baseDate = parseCustomDate(baseDateStr) const targetDate = parseCustomDate(targetDateStr) // 计算基准日期往前推days天的最早日期边界 const earliestDate = new Date(baseDate) // +1是因为包含基准日当天,比如最近7天就是基准日-6天到基准日,共7天 earliestDate.setDate(baseDate.getDate() - days + 1) // 比较时间戳判断是否在范围内 return targetDate >= earliestDate && targetDate <= baseDate }
测试用例
// 你给出的示例测试 console.log(isDateWithinLastDays('2021.6.12', '2021.6.10', 7)) // true 符合预期 console.log(isDateWithinLastDays('2021.6.12', '2021.6.01', 7)) // false 符合预期 // 边界场景测试 console.log(isDateWithinLastDays('2021.6.12', '2021.6.5', 7)) // true 6月5到6月12刚好7天 console.log(isDateWithinLastDays('2021.1.2', '2020.12.30', 7)) // true 跨月场景正常 console.log(isDateWithinLastDays('2020.3.2', '2020.2.28', 7)) // true 闰年2月场景正常
调整说明
如果不需要包含基准日当天,把earliestDate.setDate(baseDate.getDate() - days + 1)里的+1去掉即可。
内容的提问来源于stack exchange,提问作者Joji
相关产品推荐
相关产品推荐

