以下是封装好的独立验证函数,可直接调用并返回布尔值:
javascript
复制
/**
* 严格验证日期格式 YYYY-MM-DD
* @param {string} input - 需要验证的日期字符串
* @returns {boolean} - 是否为有效日期
*/
function isValidDate(input) {
// 清理输入并格式验证
const str = input.trim();
const dateRegex = /^(\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/;
if (!dateRegex.test(str)) return false;
// 提取日期组件
const [, year, month, day] = dateRegex.exec(str).map(Number);
// 闰年判断函数
const isLeapYear = (y) => (y % 4 === 0 && y % 100 !== 0) || y % 400 === 0;
// 月份天数映射表
const monthDays = [
31, // Jan
isLeapYear(year) ? 29 : 28, // Feb (动态处理闰年)
31, 30, 31, 30, // Mar-Jun
31, 31, 30, 31, 30, 31 // Jul-Dec
];
// 最终验证
return day <= monthDays[month - 1];
}使用示例
javascript
复制
// 测试用例
console.log(isValidDate('2023-02-28')); // true
console.log(isValidDate('2020-02-29')); // true
console.log(isValidDate('2023-02-29')); // false
console.log(isValidDate('1995-04-31')); // false
console.log(isValidDate('2023-13-01')); // false函数特性
纯函数:无副作用,不依赖外部状态
严格验证:
格式必须为
YYYY-MM-DD支持闰年检测
验证实际存在的日期
高性能:使用预计算的天数表
容错处理:自动去除首尾空格
实现细节
正则表达式:严格限制输入格式
javascript
复制
/^(\d{4})-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/动态二月天数:根据年份实时计算
javascript
复制
isLeapYear(year) ? 29 : 28快速验证:通过数组索引直接获取月份天数
javascript
复制
monthDays[month - 1]
扩展使用建议
javascript
复制
// 在表单验证中使用
document.querySelector('#submitBtn').addEventListener('click', () => {
const dateInput = document.querySelector('#dateInput').value;
if (!isValidDate(dateInput)) {
alert('请输入有效日期');
return;
}
// 提交逻辑...
});
// 配合输入实时验证
document.querySelector('#dateInput').addEventListener('input', function() {
this.classList.toggle('invalid', !isValidDate(this.value));
});该函数可直接复制到任何 JavaScript 项目中使用,不依赖任何第三方库。
评论区