Java 计算时间差之年龄问题

        我们在做系统开发的时候,往往会用到人的年龄,但是年龄是动态变化的,所以一般都不进行存储,而是选择存储人的生日,通过生日动态算出人的年龄。而有时候年龄需要用到周岁(月、天),这种比较具体的时间,如果小于1岁,需要具体到月,小于1月,具体到天,不足一天的按一天算,只是将当前年份减去出生日期的年份往往不准确。

        比如,一个人是1999年12月31日出生的,而当前时间是2000年1月1日,如果按照刚才说的那种方法计算的话,得到的年龄是1岁,而实际年龄只有1天。

错误思路:使用如下代码计算天数及天数以下的事件(天、小时、分钟...)可以精确计算,但是使用365的倍数计算年就会出现错误数据,如同月数不一定是30天

		DateFormat df = new SimpleDateFormat("yyyy:MM:dd");

		Date d1 = df.parse("2013:12:31");
		Date d2 = df.parse("2015:4:12");
		long diff = d1.getTime() - d2.getTime();

		long years = diff / (1000 * 60 * 60 * 24 * 365);
		long days = diff / (1000 * 60 * 60 * 24);
		long hours = (diff - days * (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
		long minutes = (diff - days * (1000 * 60 * 60 * 24) - hours * (1000 * 60 * 60)) / (1000 * 60);

		System.out.println(years + "年" + "" + days + "天" + hours + "小时" + minutes + "分");
		
		try {
			System.out.println(getAgeStr(d1));
		} catch (Exception e) {
			e.printStackTrace();
		}



正确思路:通过Calendar类和Thu Jan 01 08:00:00 CST 1970 这个日历类的起始时间

        Calendar c1 = Calendar.getInstance();
        long nowmillSeconds = c1.getTimeInMillis();
        Calendar c2 = Calendar.getInstance();
        c2.setTime(birthday);
        long birmillSeconds = c2.getTimeInMillis();
        Calendar c3 = Calendar.getInstance();
        long millis = nowmillSeconds - birmillSeconds;
        c3.setTimeInMillis(millis);
        int year = c3.get(Calendar.YEAR);
        int month = c3.get(Calendar.MONTH);
        int day = c3.get(Calendar.DAY_OF_MONTH);
        int hour = c3.get(Calendar.HOUR_OF_DAY);
        if (year > 1970) {
            return year - 1970 + "岁";
        } else if (month > Calendar.JANUARY) {
            return month - Calendar.JANUARY + "月";
        } else if (day > 1) {
            return day - 1 + "天";
        }else{
            return "1天";
        }

注意事项:

使用Calendar时一定要注意月份问题,Calendar.MONTH从0开始计算的,及一月份对应的值是0。所以,从身份证号或者生日之类的数据中取出月份值要减去1再赋值到Calendar中。





  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值