js 同时校验身份证号码的格式、校验码和出生日期的合法性 最为严谨的校验

function validateIDCard(idCard) {
    // 正则表达式校验身份证号格式
    const regExp = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])\d{3}([0-9Xx])$/;

    if (!regExp.test(idCard)) {
        return false;
    }

    // 校验码验证
    const weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
    const checkCodes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];

    const idCardChars = idCard.toUpperCase().split('');
    let sum = 0;

    for (let i = 0; i < 17; i++) {
        sum += parseInt(idCardChars[i], 10) * weights[i];
    }

    const mod = sum % 11;
    const checkCode = checkCodes[mod];

    if (checkCode !== idCardChars[17]) {
        return false;
    }

    // 验证出生日期的合法性
    const year = parseInt(idCard.substring(6, 10), 10);
    const month = parseInt(idCard.substring(10, 12), 10);
    const day = parseInt(idCard.substring(12, 14), 10);

    const currentDate = new Date();
    const currentYear = currentDate.getFullYear();
    const currentMonth = currentDate.getMonth() + 1;
    const currentDay = currentDate.getDate();

    if (
        year < 1900 ||
        year > currentYear ||
        month < 1 || month > 12 ||
        day < 1 || day > 31 ||
        (year === currentYear && month > currentMonth) ||
        (year === currentYear && month === currentMonth && day > currentDay)
    ) {
        return false;
    }

    return true;
}

// 测试示例
const idCardNumber = "身份证号"; // 替换为实际的身份证号
if (validateIDCard(idCardNumber)) {
    console.log("身份证号合法");
} else {
    console.log("身份证号不合法");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值