1 /// <summary> 2 /// 身份证帮助类 3 /// </summary> 4 public class IDCardHelper 5 { 6 #region 检测身份证的合法性 7 public static bool Check(string cardId) 8 { 9 string num = cardId.ToUpper(); 10 int[] factorArr = new int[] { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 }; 11 char[] parityBit = new char[] { '1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2' }; 12 char[] varArray = new char[18]; 13 var lngProduct = 0; 14 int intCheckDigit = 0; 15 var intStrLen = num.Length; 16 var idNumber = num; 17 if ((intStrLen != 15) && (intStrLen != 18)) 18 { 19 return false; 20 } 21 22 for (int i = 0; i < intStrLen; i++) 23 { 24 varArray[i] = (char)Convert.ToInt32(idNumber[i]); 25 if (((varArray[i] - 48) < 0 || (varArray[i] - 48) > 9) && (i != 17)) 26 { 27 return false; 28 } 29 else if (i < 17) 30 { 31 varArray[i] = (char)((varArray[i] - 48) * factorArr[i]); 32 } 33 } 34 if (intStrLen == 18) 35 { 36 var date8 = idNumber.Substring(6, 8); 37 if (isDate8(date8) == false) 38 { 39 return false; 40 } 41 for (int i = 0; i < 17; i++) 42 { 43 lngProduct = lngProduct + varArray[i]; 44 } 45 intCheckDigit = parityBit[lngProduct % 11]; 46 if (varArray[17] != intCheckDigit) 47 { 48 return false; 49 } 50 } 51 else 52 { 53 var date6 = idNumber.Substring(6, 6); 54 if (isDate6(date6) == false) 55 { 56 return false; 57 } 58 } 59 return true; 60 } 61 #endregion 62 63 #region 位身份证日期检测--年/月--6位 64 /// <summary> 65 /// 15位身份证日期检测--年/月--6位 66 /// </summary> 67 /// <param name="sDate"></param> 68 /// <returns></returns> 69 static bool isDate6(string sDate) 70 { 71 if (!System.Text.RegularExpressions.Regex.IsMatch(sDate, "^[0-9]{6}$")) 72 { 73 return false; 74 } 75 int year = Convert.ToInt32(sDate.Substring(0, 4)); 76 int month = Convert.ToInt32(sDate.Substring(4, 2)); 77 if (year < 1700 || year > 2500) return false; 78 if (month < 1 || month > 12) return false; 79 return true; 80 } 81 #endregion 82 83 #region 18位身份证日期检测--年/月/日--8位 84 /// <summary> 85 /// 18位身份证日期检测--年/月/日--8位 86 /// </summary> 87 /// <param name="sDate"></param> 88 /// <returns></returns> 89 static bool isDate8(string sDate) 90 { 91 if (!System.Text.RegularExpressions.Regex.IsMatch(sDate, "^[0-9]{8}$")) 92 { 93 return false; 94 } 95 int year = Convert.ToInt32(sDate.Substring(0, 4)); 96 int month = Convert.ToInt32(sDate.Substring(4, 2)); 97 int day = Convert.ToInt32(sDate.Substring(6, 2)); 98 99 int[] iaMonthDays = new int[] { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; 100 if (year < 1700 || year > 2500) return false; 101 if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) iaMonthDays[1] = 29; 102 if (month < 1 || month > 12) return false; 103 if (day < 1 || day > iaMonthDays[month - 1]) return false; 104 return true; 105 } 106 #endregion 107 108 #region 根据身份证号码获取年龄、生日 109 public static DateTime? GetBirthday(string cardId) 110 { 111 bool result = Check(cardId); 112 if (result) 113 { 114 int year = Convert.ToInt32(cardId.Substring(6, 4)); 115 int month = Convert.ToInt32(cardId.Substring(10, 2)); 116 int day = Convert.ToInt32(cardId.Substring(12, 2)); 117 return new DateTime(year, month, day); 118 } 119 return null; 120 } 121 #endregion 122 }