golang代码实例库

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4113|回复: 0

golang:根据身份证(或生日)计算年龄

[复制链接]

82

主题

82

帖子

486

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
486
发表于 2021-12-7 23:56:37 | 显示全部楼层 |阅读模式
实例说明
我们计算用户的年龄,当然只能根据用户的出生年月日信息来计算。这里我们定义:用户出生满1年后,年龄算1岁,不满1年算0岁,以此类推,大于1年不到2年算1岁。
1)根据身份证信息得到用户出生年月日
2)根据出生年月日计算用户当前年龄


身份证规则:
18位身份证号码:18位的第二代身份证号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码、八位数字出生日期码、三位数字顺序码和一位数字校验码。地址码(前六位数):表示身份证编码对象常住户口所在省份、地市,以及县(市、旗、区)的行政区划代码,按照GB/T2260的规定执行。其中:前1、2位数字表示所在省份的代码;第3、4位数字表示所在地市的代码;第5、6位数字表示:所在县(市、旗、区)的代码。
15位身份证号码: 1、第l一6位数为行政区划代码;是指公民第一次申领居民身份证时的常住户口所在地的行政地区。 2、第7—12位数为出生日期代码; 第7、8位为出生年份(两位数),第9、10位为出生月份,第11、12位代表出生日期。 3、第13---15位数为分配顺序代码;是按人口数统一合理分配以固定顺序给予每个人的顺序号,最末一位数是奇数的分配给男性,偶数分配给女性。


实例代码
[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
}




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|golang代码实例库 ( 粤ICP备2021162396号 )

GMT+8, 2024-12-5 08:30 , Processed in 0.030569 second(s), 29 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表