JavaScript日期验证问题:月份不在1-12时无法正确抛出错误
解决出生日期验证中无效月份/日期自动修正的问题
你的代码之所以会把971315转换成1998-01-15而非报错,核心原因是JavaScript的Date对象会自动"修正"无效的日期值——当传入13月时,它会自动将其转换为下一年的1月,导致你后续的范围检查拿到的已经是修正后的合法月份,根本触发不了错误判断。
要解决这个问题,你需要先对原始输入的月、日做范围校验,再用Date对象做最终的合法性验证,具体实现如下:
function isYearCorrect(string) { // 提取原始输入的年、月、日数值 const rawYear = parseInt(string.substring(0, 2), 10); const rawMonth = parseInt(string.substring(2, 4), 10); const rawDay = parseInt(string.substring(4, 6), 10); // 基础范围校验:拦截明显无效的月份和日期 if (rawMonth < 1 || rawMonth > 12) { return `${rawMonth} 是无效月份`; } if (rawDay < 1 || rawDay > 31) { return `${rawDay} 是无效日期`; } // 转换为完整年份(可根据业务调整两位年的映射规则) const fullYear = rawYear >= 50 ? 1900 + rawYear : 2000 + rawYear; // 创建Date对象(注意Date的月份是0-11,所以要减1) const dateOfBirth = new Date(fullYear, rawMonth - 1, rawDay); // 验证Date是否自动修正了日期:比如2月30号会被转为3月2号,此时与原始值不符 if ( dateOfBirth.getFullYear() !== fullYear || dateOfBirth.getMonth() + 1 !== rawMonth || dateOfBirth.getDate() !== rawDay ) { const formatted = `${fullYear}-${rawMonth.toString().padStart(2, '0')}-${rawDay.toString().padStart(2, '0')}`; return `${formatted} 是无效日期`; } // 所有校验通过,返回验证结果和格式化日期 const formattedDate = `${fullYear}-${rawMonth.toString().padStart(2, '0')}-${rawDay.toString().padStart(2, '0')}`; return { valid: true, date: formattedDate }; } console.log(isYearCorrect("970812")); // 输出 { valid: true, date: '1997-08-12' } console.log(isYearCorrect("721329")); // 输出 '13 是无效月份' console.log(isYearCorrect("960230")); // 输出 '1996-02-30 是无效日期'
关键说明
- 先校验原始输入的
rawMonth和rawDay,直接拦截13月、32日这类明显无效的值 - 通过对比
Date对象生成的日期与原始输入值,判断是否发生了自动修正(比如2月30号、4月31号这类场景) - 两位年份的映射规则可根据实际业务调整(比如部分系统会把00-29映射为2000-2029,30-99映射为1930-1999)
内容的提问来源于stack exchange,提问作者PalesaDev
相关产品推荐
相关产品推荐

