使用java將20年代的中國15位身份證號轉換爲18位的身份證號。java
/** * 身份證轉換,15位身份證轉換成18位身份證 * @author Arthur126 * @date 2015-8-21 下午11:06:52 * */ public class TransformId { /** * 把15位身份證號轉換成18位身份證號碼 * 出生月份前加"19"(20世紀才使用的15位身份證號碼),最後一位加校驗碼 * @param custNo * @return */ public static String transformIdFrom15To18(String custNo) { String idCardNo = null; if (custNo != null && custNo.trim().length() == 15) { custNo = custNo.trim(); StringBuffer newIdCard = new StringBuffer(custNo); newIdCard.insert(6, "19"); newIdCard.append(trasformLastNo(newIdCard.toString())); idCardNo = newIdCard.toString(); } return idCardNo; } /** * 生成身份證最後一位效驗碼 * @param id * @return */ private static String trasformLastNo(String id) { char pszSrc[] = id.toCharArray(); int iS = 0; int iW[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; char szVerCode[] = new char[] { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' }; int i; for (i = 0; i < id.length(); i++) { iS += (pszSrc[i] - '0') * iW[i]; } int iY = iS % 11; return String.valueOf(szVerCode[iY]); } public static void main(String[] args) { // 610203198401266361 System.out.println(TransformId.transformIdFrom15To18("610203840126636")); // 130406198903018347 System.out.println(TransformId.transformIdFrom15To18("130406890301834")); } }
使用JavaScript將20年代的中國15位身份證號轉換爲18位的身份證號。apache
/** * 將15位身份證號碼轉換爲18位 * @param {} idCardNo */ transformatIdFrom15To18 : function(idCardNo) { var v = new Array(2, 4, 8, 5, 10, 9, 7, 3, 6, 1, 2, 4, 8, 5, 10, 9, 7); var vs = "10X98765432"; if (idCardNo == null || pf.trim(idCardNo).length != 15) { return ""; } idCardNo = pf.trim(idCardNo); // 將15位的號碼轉換位17位 var cardID17 = idCardNo.substring(0, 6) + "19" + idCardNo.substring(6); var N = 0; var R = -1; var T = '0';// 儲存最後一個數字 var j = 0; var cardID18 = ""; // 計數出第18位數字 for (var i = 16; i >= 0; i--) { N += parseInt(cardID17.substring(i, i + 1)) * v[j]; j++; } R = N % 11; T = vs.charAt(R); cardID18 = cardID17 + T; return cardID18; }
附一個java編寫的身份證號碼處理工具類IdCardUtil:app
import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; /** * 身份證工具類 */ public class IdCardUtil { /** * 區域編碼 */ private static final String AREA_CODE = "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,"; public static void main(String[] args) throws ParseException { // System.out.println(checkIdCard("210102610334445")); // System.out.println(checkIdCard("21010219610324445X")); System.out.println(transIdFrom15To18("342422890202641")); } /** * 身份證號碼正確性校驗(含15位和18位) * * @param idCard * @return */ public static boolean checkIdCard(String idCard) { Pattern pattern_15 = Pattern.compile("^[0-9]{8}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[0-9]{3}$"); Pattern pattern_18 = Pattern .compile("^[0-9]{6}(18|19|20)[0-9]{2}(0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])[0-9]{3}([0-9]|X)$"); // 長度判斷 if (idCard != null && (idCard.length() == 15 || idCard.length() == 18)) { // 區位碼校驗 if (AREA_CODE.indexOf(idCard.substring(0, 2) + ",") != -1) { // 15位身份證校驗 if (pattern_15.matcher(idCard).matches()) { return checkDateTime("19" + idCard.substring(6, 12)); } else if (pattern_18.matcher(idCard).matches()) {// 18位身份證校驗 if (checkDateTime(idCard.substring(6, 14))) { // 最後一位校驗位比較 if (trasIdLastNo(idCard.substring(0, 17)).equals(idCard.substring(17))) { return true; } } } } } return false; } /** * 身份證中字符串日期合法性校驗yyyyMMdd * * @param dateTime * @return */ private static boolean checkDateTime(String dateTime) { DateFormat df = new SimpleDateFormat("yyyyMMdd"); try { df.parse(dateTime); } catch (ParseException e) { logger.error("身份證中字符串日期合法性校驗出錯", e); return false; } // 獲取日期詳細信息 int year = Integer.valueOf(dateTime.substring(0, 4)); int month = Integer.valueOf(dateTime.substring(4, 6)); int day = Integer.valueOf(dateTime.substring(6)); // 是否閏年 boolean isLeapYear = false; if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) { isLeapYear = true; } // 判斷月份 if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) { // 判斷日期 if (day > 0 && day < 32) { return true; } } else if (month == 4 || month == 6 || month == 9 || month == 11) { // 判斷日期 if (day > 0 && day < 31) { return true; } } else if (month == 2) { // 判斷日期 if (isLeapYear) { if (day > 0 && day < 30) { return true; } } else { if (day > 0 && day < 29) { return true; } } } return false; } /** * 根據15位或者18位身份證號碼判斷性別,按照系統參數表cs_type='CS1006'獲取 * * @param idCard * @return */ public static String judgeGenderByIdCard(String idCard) { if (StringUtils.isNotBlank(idCard)) { Pattern pattern = Pattern.compile("[0-9]*"); if (idCard.length() == 15 && pattern.matcher(idCard).matches()) { // 身份證號碼15位,都是數字,最後一位爲奇數則爲男不然爲女 if (Integer.valueOf(idCard.substring(idCard.length() - 1, idCard.length())) % 2 == 0) { return "F"; // 女 } else { return "M"; // 男 } } else if (idCard.length() == 18 && pattern.matcher(idCard.substring(0, idCard.length() - 1)).matches()) { // 身份證號碼18位,除最後一位其餘都是數字,倒數第二位爲奇數則爲男不然爲女 if (Integer.valueOf(idCard.substring(idCard.length() - 2, idCard.length() - 1)) % 2 == 0) { return "F"; // 女 } else { return "M"; // 男 } } } return "N"; // 不肯定 } /** * 根據15位或者18位身份證號碼構造出生日期 * * @param idCard * @return */ public static String constructBirthdayByIdCard(String idCard) { String birthday = ""; if (StringUtils.isNotBlank(idCard)) { Pattern pattern = Pattern.compile("[0-9]*"); if (idCard.length() == 15 && pattern.matcher(idCard).matches()) { String year = "19" + idCard.substring(6, 8); String month = idCard.substring(8, 10); String day = idCard.substring(10, 12); birthday = year + " " + month + "-" + day; } else if (idCard.length() == 18) { String year = idCard.substring(6, 10); String month = idCard.substring(10, 12); String day = idCard.substring(12, 14); birthday = year + "-" + month + "-" + day; } } return birthday; } /** * 把15位身份證號轉換成18位身份證號碼 出生月份前加"19"(20世紀才使用的15位身份證號碼),最後一位加校驗碼 * * @param custNo * @return */ public static String transIdFrom15To18(String custNo) { String idCardNo = custNo; if (StringUtils.isNotBlank(custNo) && custNo.trim().length() == 15) { custNo = custNo.trim(); StringBuffer newIdCard = new StringBuffer(custNo); newIdCard.insert(6, "19"); newIdCard.append(trasIdLastNo(newIdCard.toString())); idCardNo = newIdCard.toString(); } return idCardNo; } /** * 生成身份證最後一位效驗碼 * * @param id * @return */ private static String trasIdLastNo(String id) { char pszSrc[] = id.toCharArray(); int iS = 0; int iW[] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 }; char szVerCode[] = new char[] { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' }; int i; for (i = 0; i < id.length(); i++) { iS += (pszSrc[i] - '0') * iW[i]; } int iY = iS % 11; return String.valueOf(szVerCode[iY]); } /** * 把18位身份證號轉換成15位身份證號碼。但存在身份證號碼重複 * * @param sCustno * @return */ public static String transformationIdFrom18To15(String sCustno) { String first7No = sCustno.substring(0, 6); String lastNo = sCustno.substring(8, sCustno.length() - 1); return first7No + lastNo; } /** * 比較身份證號碼是否相等 身份證號碼長度要麼15,要麼18,其餘直接進行比較。15位與18位身份證進行比較的時候,先將15位的轉換爲18位身份證號碼 * * @param id1 * @param id2 * @return */ public static boolean compareIdCards(String id1, String id2) { if (StringUtils.isNotBlank(id1) && StringUtils.isNotBlank(id2) && (id1.length() == 15 || id1.length() == 18) && (id2.length() == 15 || id2.length() == 18)) { if (id1.length() == id2.length()) { return StringUtils.equals(id1, id2); } else { if (id1.length() == 15) { return StringUtils.equals(IdCardUtil.transIdFrom15To18(id1), id2); } else { return StringUtils.equals(id1, IdCardUtil.transIdFrom15To18(id2)); } } } else { return StringUtils.equals(id1, id2); } } }