天天看点

JS身份证号码校验,JS根据身份证号码获取出生年月日,JS根据出生年月日获取年龄,JS根据身份证号码获取性别1、JS身份证号码校验2、JS根据身份证号码获取出生年月日3、JS根据出生年月日获取年龄4、JS根据身份证号码获取性别

JS身份证号码校验,JS根据身份证号码获取出生年月日,JS根据出生年月日获取年龄,JS根据身份证号码获取性别

  • 1、JS身份证号码校验
  • 2、JS根据身份证号码获取出生年月日
  • 3、JS根据出生年月日获取年龄
  • 4、JS根据身份证号码获取性别

1、JS身份证号码校验

/**
 * 身份证校验
 *
 * @export
 * @param {*} card
 * @returns
 */
export function validIdCard(card) {
  let vcity = {
    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: "国外"
  };
  // 检查号码是否符合规范,包括长度,类型
  let isCardNo = function (card) {
    // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
    let reg = /(^\d{15}$)|(^\d{17}(\d|X)$)/;
    if (reg.test(card) === false) {
      return false;
    }
    return true;
  };
  // 取身份证前两位,校验省份
  let checkProvince = function (card) {
    let province = card.substr(0, 2);
    if (vcity[province] == undefined) {
      return false;
    }
    return true;
  };
  // 检查生日是否正确
  let checkBirthday = function (card) {
    let len = card.length;
    // 身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
    if (len == "15") {
      let re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
      let arr_data = card.match(re_fifteen);
      let year = arr_data[2];
      let month = arr_data[3];
      let day = arr_data[4];
      let birthday = new Date("19" + year + "/" + month + "/" + day);
      return verifyBirthday("19" + year, month, day, birthday);
    }
    // 身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X
    if (len == "18") {
      let re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X)$/;
      let arr_data = card.match(re_eighteen);
      let year = arr_data[2];
      let month = arr_data[3];
      let day = arr_data[4];
      let birthday = new Date(year + "/" + month + "/" + day);
      return verifyBirthday(year, month, day, birthday);
    }
    return false;
  };
  // 校验日期
  let verifyBirthday = function (year, month, day, birthday) {
    let now = new Date();
    let now_year = now.getFullYear();
    // 年月日是否合理
    if (
      birthday.getFullYear() == year &&
      birthday.getMonth() + 1 == month &&
      birthday.getDate() == day
    ) {
      // 判断年份的范围(3岁到100岁之间)
      let time = now_year - year;
      if (time >= 3 && time <= 100) {
        return true;
      }
      return false;
    }
    return false;
  };
  // 校验位的检测
  let checkParity = function (card) {
    // 15位转18位
    card = changeFivteenToEighteen(card);
    let len = card.length;
    if (len == "18") {
      let arrInt = new Array(
        7,
        9,
        10,
        5,
        8,
        4,
        2,
        1,
        6,
        3,
        7,
        9,
        10,
        5,
        8,
        4,
        2
      );
      let arrCh = new Array(
        "1",
        "0",
        "X",
        "9",
        "8",
        "7",
        "6",
        "5",
        "4",
        "3",
        "2"
      );
      let cardTemp = 0,
        i,
        valnum;
      for (i = 0; i < 17; i++) {
        cardTemp += card.substr(i, 1) * arrInt[i];
      }
      valnum = arrCh[cardTemp % 11];
      if (valnum == card.substr(17, 1)) {
        return true;
      }
      return false;
    }
    return false;
  };
  // 15位转18位身份证号
  let changeFivteenToEighteen = function (card) {
    if (card.length == "15") {
      let arrInt = new Array(
        7,
        9,
        10,
        5,
        8,
        4,
        2,
        1,
        6,
        3,
        7,
        9,
        10,
        5,
        8,
        4,
        2
      );
      let arrCh = new Array(
        "1",
        "0",
        "X",
        "9",
        "8",
        "7",
        "6",
        "5",
        "4",
        "3",
        "2"
      );
      let cardTemp = 0,
        i;
      card = card.substr(0, 6) + "19" + card.substr(6, card.length - 6);
      for (i = 0; i < 17; i++) {
        cardTemp += card.substr(i, 1) * arrInt[i];
      }
      card += arrCh[cardTemp % 11];
      return card;
    }
    return card;
  };
  // 是否为空
  if (card === "") {
    return false;
  }
  // 校验长度,类型
  if (isCardNo(card) === false) {
    return false;
  }
  // 检查省份
  if (checkProvince(card) === false) {
    return false;
  }
  // 校验生日
  if (checkBirthday(card) === false) {
    return false;
  }
  // 检验位的检测
  if (checkParity(card) === false) {
    return false;
  }
  return true;
}
           

2、JS根据身份证号码获取出生年月日

/**
 * 根据身份证号码获取出生年月日
 *
 * @export
 * @param {*} idCard
 * @returns
 */
export function getBirthdayFromIdCard(idCard) {
  let birthday = "";
  if (idCard != null && idCard != "") {
    if (idCard.length == 15) {
      birthday = "19" + idCard.substr(6, 6);
    } else if (idCard.length == 18) {
      birthday = idCard.substr(6, 8);
    }
    birthday = birthday.replace(/(.{4})(.{2})/, "$1-$2-");
  }
  return birthday;
}
           

3、JS根据出生年月日获取年龄

/**
 * 根据出生年月日获取年龄
 *
 * @export
 * @param {*} birthday
 * @returns
 */
export function getAgeFromBirthday(birthday) {
  let birthDate = new Date(birthday)
  let nowDateTime = new Date()
  let age = nowDateTime.getFullYear() - birthDate.getFullYear()
  if (nowDateTime.getMonth() < birthDate.getMonth() ||
    (nowDateTime.getMonth() == birthDate.getMonth() &&
      nowDateTime.getDate() < birthDate.getDate())) {
    age--
  }
  return age
}
           

4、JS根据身份证号码获取性别

/**
 * 根据身份证号码获取性别,性别是根据身份证的倒数第二位来判断的,奇数为男,偶数为女
 *
 * @export
 * @param {*} idCard
 * @returns
 */
export function getSexFromIdCard(idCard) {
  let sex = "";
  if (parseInt(idCard.slice(-2, -1) % 2) == 1) {
    sex = "male";
  } else {
    sex = "female";
  }
  return sex;
}
           

继续阅读