校验身份证号的js工具

新建文件copy代码拿来即用

var idCardNoUtil = {
/* 省,直辖市代码表*/
  provinceAndCitys: { 11: '北京', 12: '天津', 13: '河北', 14: '山西', 15: '内蒙古', 21: '辽宁', 22: '吉林', 23: '黑龙江',
    31: '上海', 32: '江苏', 33: '浙江', 34: '安徽', 35: '福建', 36: '江西', 37: '山东', 41: '河南', 42: '湖北', 43: '湖南', 44: '广东',
    45: '广西', 46: '海南', 50: '重庆', 51: '四川', 52: '贵州', 53: '云南', 54: '西藏', 61: '陕西', 62: '甘肃', 63: '青海', 64: '宁夏',
    65: '新疆', 71: '台湾', 81: '香港', 82: '澳门', 91: '国外' },
  /* 每位加权因子*/
  powers: ['7', '9', '10', '5', '8', '4', '2', '1', '6', '3', '7', '9', '10', '5', '8', '4', '2'],
  /* 第18位校检码*/
  parityBit: ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'],

  /* 性别*/
  genders: { male: '1', female: '2' },

  /* 校验地址码*/
  checkAddressCode: function(addressCode) {
    var check = /^[1-9]\d{5}$/.test(addressCode)
    if (!check) return false
    if (idCardNoUtil.provinceAndCitys[parseInt(addressCode.substring(0, 2))]) {
      return true
    } else {
      return false
    }
  },

  /* 校验日期码*/
  checkBirthDayCode: function(birDayCode) {
    var check = /^[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))$/.test(birDayCode)
    if (!check) return false
    var yyyy = parseInt(birDayCode.substring(0, 4), 10)
    var mm = parseInt(birDayCode.substring(4, 6), 10)
    var dd = parseInt(birDayCode.substring(6), 10)
    var xdata = new Date(yyyy, mm - 1, dd)
    if (xdata > new Date()) {
      return false// 生日不能大于当前日期
    } else if ((xdata.getFullYear() === yyyy) && (xdata.getMonth() === mm - 1) && (xdata.getDate() === dd)) {
      return true
    } else {
      return false
    }
  },

  /* 计算校检码*/
  getParityBit: function(idCardNo) {
    var id17 = idCardNo.substring(0, 17)
    /* 加权 */
    var power = 0
    for (var i = 0; i < 17; i++) {
      power += parseInt(id17.charAt(i), 10) * parseInt(idCardNoUtil.powers[i])
    }
    /* 取模*/
    var mod = power % 11
    return idCardNoUtil.parityBit[mod]
  },

  /* 验证校检码*/
  checkParityBit: function(idCardNo) {
    var parityBit = idCardNo.charAt(17).toUpperCase()
    if (idCardNoUtil.getParityBit(idCardNo) === parityBit) {
      return true
    } else {
      return false
    }
  },

  /* 校验15位或18位的身份证号码*/
  checkIdCardNo: function(idCardNo) {
    // 15位和18位身份证号码的基本校验
    var check = /^\d{15}|(\d{17}(\d|x|X))$/.test(idCardNo)
    if (!check) return false
    // 判断长度为15位或18位
    if (idCardNo.length === 15) {
      return idCardNoUtil.check15IdCardNo(idCardNo)
    } else if (idCardNo.length === 18) {
      return idCardNoUtil.check18IdCardNo(idCardNo)
    } else {
      return false
    }
  },

  // 校验15位的身份证号码
  check15IdCardNo: function(idCardNo) {
    // 15位身份证号码的基本校验
    var check = /^[1-9]\d{7}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}$/.test(idCardNo)
    if (!check) return false
    // 校验地址码
    var addressCode = idCardNo.substring(0, 6)
    check = idCardNoUtil.checkAddressCode(addressCode)
    if (!check) return false
    var birDayCode = '19' + idCardNo.substring(6, 12)
    // 校验日期码
    return idCardNoUtil.checkBirthDayCode(birDayCode)
  },

  // 校验18位的身份证号码
  check18IdCardNo: function(idCardNo) {
    // 18位身份证号码的基本格式校验
    var check = /^[1-9]\d{5}[1-9]\d{3}((0[1-9])|(1[0-2]))((0[1-9])|([1-2][0-9])|(3[0-1]))\d{3}(\d|x|X)$/.test(idCardNo)
    if (!check) return false
    // 校验地址码
    var addressCode = idCardNo.substring(0, 6)
    check = idCardNoUtil.checkAddressCode(addressCode)
    if (!check) return false
    // 校验日期码
    var birDayCode = idCardNo.substring(6, 14)
    check = idCardNoUtil.checkBirthDayCode(birDayCode)
    if (!check) return false
    // 验证校检码
    return idCardNoUtil.checkParityBit(idCardNo)
  },

  formateDateCN: function(day) {
    var yyyy = day.substring(0, 4)
    var mm = day.substring(4, 6)
    var dd = day.substring(6)
    return yyyy + '-' + mm + '-' + dd
  },

  // 获取信息
  getIdCardInfo: function(idCardNo) {
    var idCardInfo = {
      gender: '', // 性别
      birthday: '' // 出生日期(yyyy-mm-dd)
    }
    if (idCardNo.length === 15) {
      var aday = '19' + idCardNo.substring(6, 12)
      idCardInfo.birthday = idCardNoUtil.formateDateCN(aday)
      if (parseInt(idCardNo.charAt(14)) % 2 === 0) {
        idCardInfo.gender = idCardNoUtil.genders.female
      } else {
        idCardInfo.gender = idCardNoUtil.genders.male
      }
    } else if (idCardNo.length === 18) {
      const aday = idCardNo.substring(6, 14)
      idCardInfo.birthday = idCardNoUtil.formateDateCN(aday)
      if (parseInt(idCardNo.charAt(16)) % 2 === 0) {
        idCardInfo.gender = idCardNoUtil.genders.female
      } else {
        idCardInfo.gender = idCardNoUtil.genders.male
      }
    }
    return idCardInfo
  },

  /* 18位转15位*/
  getId15: function(idCardNo) {
    if (idCardNo.length === 15) {
      return idCardNo
    } else if (idCardNo.length === 18) {
      return idCardNo.substring(0, 6) + idCardNo.substring(8, 17)
    } else {
      return null
    }
  },

  /* 15位转18位*/
  getId18: function(idCardNo) {
    if (idCardNo.length === 15) {
      var id17 = idCardNo.substring(0, 6) + '19' + idCardNo.substring(6)
      var parityBit = idCardNoUtil.getParityBit(id17)
      return id17 + parityBit
    } else if (idCardNo.length === 18) {
      return idCardNo
    } else {
      return null
    }
  }
}
/* 根据出生日期算出年龄*/
export function getAge(strBirthday) {
  var returnAge
  var strBirthdayArr = strBirthday.split('-')
  var birthYear = Number(strBirthdayArr[0])
  var birthMonth = Number(strBirthdayArr[1])
  var birthDay = Number(strBirthdayArr[2])
  const nowDate = new Date()
  var nowYear = nowDate.getFullYear()
  var nowMonth = nowDate.getMonth() + 1
  var nowDay = nowDate.getDate()
  if (nowYear === birthYear) {
    returnAge = 0// 同年 则为0岁
  } else {
    var ageDiff = nowYear - birthYear // 年之差
    if (ageDiff > 0) {
      if (nowMonth === birthMonth) {
        var dayDiff = nowDay - birthDay// 日之差
        if (dayDiff < 0) {
          returnAge = ageDiff - 1
        } else {
          returnAge = ageDiff
        }
      } else {
        var monthDiff = nowMonth - birthMonth// 月之差
        if (monthDiff < 0) {
          returnAge = ageDiff - 1
        } else {
          returnAge = ageDiff
        }
      }
    } else {
      returnAge = -1// 返回-1 表示出生日期输入错误 晚于今天
    }
  }
  return returnAge// 返回周岁年龄
}
export function idCardNoVerify(value) {
  return idCardNoUtil.checkIdCardNo(value)
}
// 根据身份证获取 出生日期 和性别
export function getIdCardInfo(idCardNo) {
  var idCardInfo = {
    gender: '', // 性别
    birthday: '' // 出生日期(yyyy-mm-dd)
  }
  if (idCardNo.length === 15) {
    var aday = '19' + idCardNo.substring(6, 12)
    idCardInfo.birthday = idCardNoUtil.formateDateCN(aday)
    if (parseInt(idCardNo.charAt(14)) % 2 === 0) {
      idCardInfo.gender = idCardNoUtil.genders.female
    } else {
      idCardInfo.gender = idCardNoUtil.genders.male
    }
  } else if (idCardNo.length === 18) {
    const aday = idCardNo.substring(6, 14)
    idCardInfo.birthday = idCardNoUtil.formateDateCN(aday)
    if (parseInt(idCardNo.charAt(16)) % 2 === 0) {
      idCardInfo.gender = idCardNoUtil.genders.female
    } else {
      idCardInfo.gender = idCardNoUtil.genders.male
    }
  }
  return idCardInfo
}
export function getRealAge(date1, date2) {
  const begin = new Date(date1)
  const end = new Date(date2)

  // 如果开始时间晚于结束时间,交换日期,并记录交换状态
  if (begin > end) {
    return { Y: 0, M: 0, D: 0 }
  }

  // 分别取二个日期的年、月、日值
  const d1 = begin.getDate()
  const m1 = begin.getMonth() + 1
  const y1 = begin.getFullYear()
  const d2 = end.getDate()
  const m2 = end.getMonth() + 1
  const y2 = end.getFullYear()

  // 获取每个月的天数,这里要注意一下闰年的2月
  var getMonthDays = function (y, m) {
    var aMonthDays = [31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    if (m === 2 && ((y % 400 === 0) || (y % 4 === 0 && y % 100 !== 0))) {
      return 29
    }
    return aMonthDays[m]
  }

  let m, d
  let tmpM = 0
  let tmpY = 0

  let tempD = 0

  // 计算日,不足时向月份借
  if (d2 >= d1) {
    d = d2 - d1
  } else {
    tmpM = -1
    tempD = getMonthDays(y2, m2 - 1)
    d = tempD - d1 + d2
    // d = getMonthDays(y1, m1) - d1 + d2
    // if (getMonthDays(y2, m2 - 1) < d1) {
    //   d = getMonthDays(y1, m1) - d1 + d2
    // } else {
    //   d = getMonthDays(y2, m2 - 1) - d1 + d2
    // }
  }

  // 计算月,不足时向年份借
  if (m2 + tmpM >= m1) {
    m = m2 + tmpM - m1
  } else {
    tmpY = -1
    m = 12 + m2 + tmpM - m1
  }

  // 计算年
  let y = y2 + tmpY - y1

  y = y < 0 ? 0 : y
  m = m < 0 ? 0 : m
  d = d < 0 ? 0 : d

  return { Y: y, M: m, D: d }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值