123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- package utils
- import (
- "fmt"
- "strconv"
- "time"
- )
- func IsValidOldIDCard(idCard string) bool {
- if len(idCard) != 15 {
- return false
- }
- // 分离出生日期
- birthYearStr := idCard[6:8]
- birthMonthStr := idCard[8:10]
- birthDayStr := idCard[10:12]
- // 转换为四位年份
- birthYear, err := strconv.Atoi(birthYearStr)
- if err != nil {
- return false
- }
- if birthYear >= 0 && birthYear <= 99 {
- birthYear = 1900 + birthYear
- } else if birthYear >= 100 && birthYear <= 999 {
- birthYear = 2000 + (birthYear % 100)
- }
- birthMonth, err := strconv.Atoi(birthMonthStr)
- if err != nil {
- return false
- }
- birthDay, err := strconv.Atoi(birthDayStr)
- if err != nil {
- return false
- }
- // 检查出生日期是否有效
- if birthYear < 1900 || birthYear > time.Now().Year() ||
- birthMonth < 1 || birthMonth > 12 ||
- birthDay < 1 || birthDay > 31 {
- return false
- }
- // 检查月份和天数的有效性
- _, err = time.Parse(time.DateOnly, fmt.Sprintf("%d-%d-%d", birthYear, birthMonth, birthDay))
- if err != nil {
- return false
- }
- // 检查性别
- genderCode, _ := strconv.Atoi(idCard[14:15])
- if genderCode%2 == 0 {
- return true // 女性
- } else {
- return true // 男性
- }
- }
- func IsValidIDCard(idCard string) bool {
- if len(idCard) != 18 {
- return false
- }
- // 加权因子
- weights := []int{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}
- // 校验码映射表
- checkSumMap := map[int]string{0: "1", 1: "0", 2: "X", 3: "9", 4: "8", 5: "7", 6: "6", 7: "5", 8: "4", 9: "3", 10: "2"}
- // 计算校验码
- sum := 0
- for i, ch := range idCard[:17] {
- digit, _ := strconv.Atoi(string(ch))
- sum += digit * weights[i]
- }
- checkSum := sum % 11
- checkDigit := checkSumMap[checkSum]
- check := idCard[17:18]
- // 检查最后一位是否匹配
- if checkDigit != check {
- return false
- }
- // 验证出生日期
- birthYear, _ := strconv.Atoi(idCard[6:10])
- birthMonth, _ := strconv.Atoi(idCard[10:12])
- birthDay, _ := strconv.Atoi(idCard[12:14])
- if birthYear < 1900 || birthYear > time.Now().Year() ||
- birthMonth < 1 || birthMonth > 12 ||
- birthDay < 1 || birthDay > 31 {
- return false
- }
- // 检查月份和天数的有效性
- _, err := time.Parse(time.DateOnly, fmt.Sprintf("%d-%d-%d", birthYear, birthMonth, birthDay))
- if err != nil {
- return false
- }
- // 检查性别
- genderCode, _ := strconv.Atoi(idCard[16:17])
- if genderCode%2 == 0 {
- return true // 女性
- } else {
- return true // 男性
- }
- }
|