根据生日计算年龄

原帖:这里

 

根据自己需要改了改。
 

根据生日计算年龄可以通过Calendar实现。最简单可以考虑get(Calendar.DAY_OF_YEAR)来简单修正年龄,但是遇到生日在闰年的2月29之后,或者今年是闰年的2月29之后可能出现计算不准,误差一天。所以还是老实判断年月日好了。

    /**
     * 根据出生日期计算年龄
     * 
     * @param birthDay
     * @return 未来日期返回0
     * @throws Exception
     */
    public static int getAge(Date birthDay) throws Exception {

        Calendar cal = Calendar.getInstance();

        if (cal.before(birthDay)) {
            return 0;
        }

        int yearNow = cal.get(Calendar.YEAR);
        int monthNow = cal.get(Calendar.MONTH);
        int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
        cal.setTime(birthDay);

        int yearBirth = cal.get(Calendar.YEAR);
        int monthBirth = cal.get(Calendar.MONTH);
        int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);

        int age = yearNow - yearBirth;

        if (monthNow <= monthBirth) {
            if (monthNow == monthBirth) {
                if (dayOfMonthNow < dayOfMonthBirth) {
                    age--;
                }
            } else {
                age--;
            }
        }

        return age;
    }

    /**
     * 根据出生日期计算年龄
     * 
     * @param strBirthDay
     *            字符串型日期
     * @param format
     *            日期格式
     * @return 未来日期返回0
     * @throws Exception
     */
    public static int getAge(String strBirthDay, String format)
            throws Exception {

        DateFormat df = new SimpleDateFormat(format);
        Date birthDay = df.parse(strBirthDay);
        return getAge(birthDay);
    }
 
<think>我们要在MySQL中根据生日计算年龄。通常的做法是使用当前日期减去生日日期,然后提取年份部分。但是需要注意的是,如果当前日期还没有到生日,那么年龄应该减1。 我们可以使用TIMESTAMPDIFF函数,它可以计算两个日期之间的差值,并指定单位(例如年)。 语法:TIMESTAMPDIFF(unit, datetime_expr1, datetime_expr2) 这里我们使用'YEAR'作为单位,datetime_expr1是生日,datetime_expr2是当前日期(如CURDATE())。 但是注意:TIMESTAMPDIFF会返回两个日期之间的完整年份数,也就是说它会自动判断是否已经过了生日。例如,如果今天是2023年10月1日,生日是2000年10月2日,那么计算出来的年龄是22岁(因为还没过生日),而过了10月2日就是23岁。 因此,我们可以这样写: SELECT TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS age FROM table_name; 另外,也可以使用YEAR函数和CURDATE()来获取当前年份,然后减去生日的年份,再通过判断当前日期是否小于生日的日期(即是否还没过生日)来调整: SELECT YEAR(CURDATE()) - YEAR(birthday) - (DATE_FORMAT(CURDATE(), '%m%d') < DATE_FORMAT(birthday, '%m%d')) AS age FROM table_name; 但是,第一种方法(TIMESTAMPDIFF)更简洁,且考虑了闰年等复杂情况,所以推荐使用。 下面给出两种方法,但优先推荐第一种。 </think>在 MySQL 中根据生日计算年龄,推荐使用 `TIMESTAMPDIFF` 函数精确计算年份差值,自动处理跨年问题。以下是两种方法: ### 方法一:使用 TIMESTAMPDIFF(推荐) ```sql SELECT TIMESTAMPDIFF(YEAR, birthday, CURDATE()) AS age FROM users; ``` **原理**: 直接计算生日到当前日期的整年差值(自动处理闰年和月份边界),无需额外判断。 ### 方法二:手动计算(兼容旧版本) ```sql SELECT YEAR(CURDATE()) - YEAR(birthday) - (DATE_FORMAT(CURDATE(), '%m%d') < DATE_FORMAT(birthday, '%m%d')) AS age FROM users; ``` **原理**: 1. `YEAR(CURDATE()) - YEAR(birthday)` 计算年份差 2. 后半部分判断当前日期是否早于生日月日:若未到生日则减 1。 ### 注意事项 - `birthday` 需为 `DATE` 类型字段 - 当前日期用 `CURDATE()` 获取 - 方法二中的 `%m%d` 格式确保精确比较月日(如 `'0101'` 表示1月1日)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值