基于Moment.js忽略年份判断日期是否在指定范围(生日校验场景)
解决生日校验:忽略年份判断是否在当前日期±10天内
嘿,我完全懂你遇到的麻烦——用Moment.js的isBetween直接判断会带上年份干扰,只比月日又搞不定跨年的边界情况(比如12月30日生日遇上1月5日当前日)。我来给你一个靠谱的解决方案:
核心思路
因为生日不需要考虑年份,我们得覆盖生日可能对应的三个实际日期场景:今年的同月同日、去年的同月同日、明年的同月同日。只要这三个日期里有任何一个落在当前日期的±10天范围内,就符合校验要求。这个方法完美解决了跨年的尴尬情况。
代码实现
function isBirthdayWithin10Days(birthDate) { const today = moment(); // 解析目标生日(如果你的输入格式不同,调整第二个参数即可) const birthday = moment(birthDate, 'YYYY-MM-DD'); // 生成三个可能的生日日期:今年、去年、明年的同月同日 const thisYearBday = moment({ year: today.year(), month: birthday.month(), day: birthday.date() }); const lastYearBday = thisYearBday.clone().subtract(1, 'year'); const nextYearBday = thisYearBday.clone().add(1, 'year'); // 定义当前日期的±10天范围 const rangeStart = today.clone().subtract(10, 'days'); const rangeEnd = today.clone().add(10, 'days'); // 检查三个日期是否有任一在范围内('[]'表示包含边界值) return ( thisYearBday.isBetween(rangeStart, rangeEnd, null, '[]') || lastYearBday.isBetween(rangeStart, rangeEnd, null, '[]') || nextYearBday.isBetween(rangeStart, rangeEnd, null, '[]') ); }
为什么这个方法有效?
举两个典型的边界场景验证:
- 场景1:当前是1月5日,生日是12月28日:去年的12月28日距离今天仅8天,落在±10天范围内,函数会返回
true - 场景2:当前是12月25日,生日是1月3日:明年的1月3日距离今天9天,同样会被检测到,返回
true
如果是普通非跨年期(比如当前是5月10日,生日是5月15日),今年的生日会直接命中范围,逻辑同样成立。
补充说明
- 如果你拿到的生日数据不带年份(比如只有
MM-DD),可以直接用moment({month: ..., day: ...})构造,无需解析年份 isBetween的第四个参数'[]'表示包含起始和结束日期,若需要排除边界,可以改成'()'
内容的提问来源于stack exchange,提问作者Touqeer
相关产品推荐
相关产品推荐

