Android(Java) 如何根据出生日期(DOB)与出生时间计算年龄
Android Java 基于选择的日期计算年龄实现方案
你已经从DatePicker、TimePicker拿到了选择的日期、时间返回值,计算年龄核心是处理好日期组件的月份起始规则,避开手动计算时间差的坑,下面给出两种可直接复用的实现:
前置说明
- DatePicker回调返回的月份值范围是0-11,对应自然月1-12月,不同时间API对月份的计数规则不一样,写代码的时候一定要对齐规则,不然会出现月份差1的问题
- 常规场景下计算周岁年龄只需要用到DatePicker返回的年、月、日三个值,TimePicker返回的时、分仅在需要计算精确到时分的年龄差时使用
方案1:java.time API实现(官方推荐,无逻辑漏洞)
Android 8.0(API26)及以上原生支持该API,低版本可以通过开启Java 8+ API desugaring支持,是目前最稳妥的实现方式,自动处理闰年、大小月、时区等边界场景:
// 替换成你自己从DatePicker回调中拿到的三个值 int selectYear = datePicker.getYear(); // 注意:LocalDate的月份是1-12计数,DatePicker返回的月份是0起始,这里必须+1 int selectMonth = datePicker.getMonth() + 1; int selectDay = datePicker.getDayOfMonth(); // 构造出生日期对象 LocalDate birthDate = LocalDate.of(selectYear, selectMonth, selectDay); LocalDate today = LocalDate.now(); // 计算两个日期之间的完整年差,就是日常所说的周岁 int age = Period.between(birthDate, today).getYears();
如果需要计算精确到时分的年龄,可以把TimePicker拿到的小时、分钟拼接为LocalDateTime对象,用Duration.between()计算时间差即可,普通业务场景不需要。
方案2:Calendar实现(全版本兼容,无需额外适配)
如果不想做desugaring适配,可以用系统原生的Calendar类实现,注意Calendar本身的月份也是0起始,和DatePicker返回值规则一致,不需要额外偏移:
Calendar birthCalendar = Calendar.getInstance(); birthCalendar.set(Calendar.YEAR, datePicker.getYear()); birthCalendar.set(Calendar.MONTH, datePicker.getMonth()); birthCalendar.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth()); // 需要精确到时间再放开下面两行,传入TimePicker的值 // birthCalendar.set(Calendar.HOUR_OF_DAY, timePicker.getHour()); // birthCalendar.set(Calendar.MINUTE, timePicker.getMinute()); Calendar currentCalendar = Calendar.getInstance(); int age = currentCalendar.get(Calendar.YEAR) - birthCalendar.get(Calendar.YEAR); // 判断今年的生日是否还没到,没到的话年龄要减1 if (currentCalendar.get(Calendar.DAY_OF_YEAR) < birthCalendar.get(Calendar.DAY_OF_YEAR)) { age--; } // 兜底处理异常日期场景,避免出现负数年龄 age = Math.max(age, 0);
踩坑提醒:不要自己拿时间戳差值除以一年的毫秒数算年龄,闰年、大小月、夏令时切换都会导致计算结果出错,用系统封装好的API是最省事的选择。
内容的提问来源于stack exchange,提问作者D12 Bhoomi
相关产品推荐
相关产品推荐

