天天看點

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;
}
           

繼續閱讀