根据身份证号判断证件持有人的性别、年龄、生日。废话不多说,直接上代码。
public class IdentifyCard { private static final Integer[] ODD_NUMS = {1, 3, 5, 7, 9}; private static final Integer[] EVEN_NUMS = {0, 2, 4, 6, 8}; private static final ThreadLocal<SimpleDateFormat> DATE_FORMAT_THREAD_LOCAL = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyyMMdd")); /** * @param area 地区码,如:110101 * @param birthday 出生日期:20000101 * @param sex 性别:0=男;1=女 * @param size 最小1;最大500 * @return results 生成结果集 */ public static String[] generator(String area, Date birthday, int sex, int size) { SexEnum.checkSex(sex); checkSize(size); List<String> resultList = new ArrayList<>(size); String simpleBirthday = DATE_FORMAT_THREAD_LOCAL.get().format(birthday); Set<String> numbers = ordinalNumbers(sex, size); for (String seqNo : numbers) { String prefix = area + simpleBirthday + seqNo; String cardNo = prefix + getCheckCode(prefix); resultList.add(cardNo); } String[] results = resultList.toArray(new String[size]); new RandomSort<String>(results).changePosition(); return results; } private static void checkSize(int size) { if (size < 1 || size > 500) { throw new IllegalArgumentException("The size min 1, max 500."); } } // prefix = area + birthdayFormat + seqNo private static String getCheckCode(String prefix) { int sum = 0; for (int i = 0; i < prefix.length(); i++) {