JavaScript中如何让无效年/月/日参数返回null而非自动修正日期?
验证日期有效性并返回null(而非自动修正)
要实现输入年、月、日组合无效时返回null,核心思路是创建Date对象后反向验证输入值与Date实例的实际值是否一致——因为JavaScript的Date会自动修正无效日期,修正后的日期会和原始输入产生差异,通过对比就能判断是否为无效日期。
实现代码
function validateDate(yearStr, monthStr, dayStr) { // 将字符串参数转为数字,指定10进制避免八进制解析问题 const year = parseInt(yearStr, 10); const month = parseInt(monthStr, 10); const day = parseInt(dayStr, 10); // 创建Date实例,注意月份参数是0起始,所以减1 const date = new Date(year, month - 1, day); // 对比输入值与Date实例的实际年、月、日 if ( date.getFullYear() === year && date.getMonth() + 1 === month && date.getDate() === day ) { return date; // 若需返回格式化字符串,可改为 date.toISOString().split('T')[0] } else { return null; } }
测试用例验证
// 无效日期:11月没有31日 console.log(validateDate("2023", "11", "31")); // null // 有效日期:11月30日 console.log(validateDate("2023", "11", "30")); // Wed Nov 30 2023 00:00:00 ... // 有效闰年日期:2020年2月29日 console.log(validateDate("2020", "02", "29")); // Sat Feb 29 2020 00:00:00 ... // 无效平年日期:2021年2月29日 console.log(validateDate("2021", "02", "29")); // null // 无效日期:4月没有31日 console.log(validateDate("2023", "04", "31")); // null
原理说明
JavaScript的Date构造函数在接收无效日期参数时,会自动进行日期修正(比如11月31日会被修正为12月1日)。此时Date实例的getFullYear()、getMonth()+1、getDate()返回值会和原始输入的年、月、日不匹配,通过对比这三个值就能精准判断输入是否为有效日期。
内容的提问来源于stack exchange,提问作者user2522570
相关产品推荐
相关产品推荐

