[Golang] 纯文本查看 复制代码
package main[/size][size=5]
import (
"fmt"
"strconv"
"time"
)
// getBirthday 根据身份证获取对应生日
func getBirthday(cardId string) string {
// 兼容第一代15位身份证号码
if len(cardId) == 15 {
// 第一代身份证年份都是19开头的
return fmt.Sprintf("19%s", cardId[6:12])
} else {
return cardId[6:14]
}
}
// getAgeByBirthday 根据生日日期得到用户年龄
func getAgeByBirthday(birthday string) int {
year, _ := strconv.Atoi(birthday[0:4])
month, _ := strconv.Atoi(birthday[4:6])
day, _ := strconv.Atoi(birthday[6:])
// 计算当前日期与生日中年月日都差值
now := time.Now()
age := now.Year() - year
moreMonth := int(now.Month()) - month
moreDay := now.Day() - day
// 未到生日月份,或者到了月份,但未到生日日期,年龄都要减1岁
if moreMonth < 0 || (moreMonth == 0 && moreDay < 0) {
age--
}
// 不要出现负值
if age < 0 {
age = 0
}
return age
}
func main() {
// 支持15位身份证号码
cardId1 := "320311770706002"
birthday1 := getBirthday(cardId1)
age1 := getAgeByBirthday(birthday1)
fmt.Println(age1)
// 当前时间:2021-12-07,输出:44
// 支持18位身份证号码
cardId2 := "511702198002221308"
birthday2 := getBirthday(cardId2)
age2 := getAgeByBirthday(birthday2)
fmt.Println(age2)
// 当前时间:2021-12-07,输出:41
}