如何根据给定年龄计算正确最小出生日期?解决年龄过滤问题
问题分析与修正方案
你的代码逻辑存在本质问题:它只能算出今天刚好年满指定年龄的人的出生日期,但实际要过滤某一年龄的用户,需要的是一个出生日期区间,而非单个日期。
比如你提到的场景:2022-12-20时,23岁的用户包含所有出生日期在1998-12-21至1999-12-20之间的人(已过23岁生日,且未满24岁),而你的代码只返回了1999-12-20(刚好今天满23岁的人),自然会漏掉像1999-11-24这类已过生日的用户。
修正思路
根据不同的过滤需求,对应的出生日期区间逻辑如下:
- 筛选当前年龄等于N岁的用户:出生日期需满足
≥ (当前日期 - (N+1)年 + 1天)且≤ (当前日期 - N年) - 筛选当前年龄≥N岁的用户:出生日期 ≤ (当前日期 - N年)
- 筛选当前年龄≤N岁的用户:出生日期 ≥ (当前日期 - (N+1)年 + 1天)
修正后的代码
如果你需要获取年龄对应的出生日期区间,可以编写两个方法分别返回区间的起止日期:
import java.time.LocalDate; // 获取年龄为age岁的用户的出生日期起始日期(左闭) public LocalDate getDOBStartForAge(int age) { LocalDate today = LocalDate.now(); return today.minusYears(age + 1).plusDays(1); } // 获取年龄为age岁的用户的出生日期结束日期(右闭) public LocalDate getDOBEndForAge(int age) { LocalDate today = LocalDate.now(); return today.minusYears(age); }
以你的示例验证:
- 当前日期2022-12-20,age=23
- 起始日期:2022-12-20 -24年 +1天 = 1998-12-21
- 结束日期:2022-12-20 -23年 = 1999-12-20
此时1999-11-24的用户会被包含在这个区间内,符合23岁的过滤要求。
在数据库查询时,直接使用这两个日期作为条件,比如用 BETWEEN 语句即可完成过滤。
内容的提问来源于stack exchange,提问作者Vince Ybañez
相关产品推荐
相关产品推荐

