使用 java.time.period 的 between() 方法计算年龄。传入出生日期的 localdate 和当前日期的 localdate,调用 getyears() 即可得到周岁。若需处理闰年或特定边界情况,该 api 会自动按日历规则精确计算。

Period.between() 如何处理生日当月未满周岁的情况
Period.between() 返回的是完整的时间段,只有当当前日期达到或超过生日时,年份差才会增加。例如,出生在 2000-05-10,今天是 2023-05-09,结果为 22 岁;若是 2023-05-10,则变为 23 岁。这种逻辑符合自然年龄定义,无需手动判断月份和日期。

import java.time.LocalDate;
import java.time.Period;
public class AgeCalculator {
public static void main(String[] args) {
LocalDate birthDate = LocalDate.of(2000, 5, 10);
LocalDate today = LocalDate.now();
Period period = Period.between(birthDate, today);
int age = period.getYears();
System.out.println("Age: " + age);
}
}
ChronoUnit.YEARS.between() 与 Period 的区别是什么
ChronoUnit.YEARS.between() 计算的是两个日期之间的整年数,它直接相减年份部分并忽略中间的天数影响,可能导致结果比实际周岁大 1 岁。而 Period 考虑了具体的月日,更准确。在需要精确周岁时,应优先使用 Period。

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
public class ChronoUnitAge {
public static void main(String[] args) {
LocalDate birthDate = LocalDate.of(2000, 5, 10);
LocalDate today = LocalDate.of(2023, 5, 9);
long yearsChrono = ChronoUnit.YEARS.between(birthDate, today);
System.out.println("ChronoUnit Years: " + yearsChrono);
}
}
如果出生日期是闰年的 2 月 29 日,非闰年如何计算年龄
当出生日期为闰年 2 月 29 日时,在非闰年(如 2023 年)计算年龄,Period.between() 会将目标日期视为当年的 2 月 28 日或 3 月 1 日进行对比,具体取决于实现细节,但通常 Java 8+ 的 LocalDate 在处理此类边界时,会认为 2 月 28 日尚未过生日,3 月 1 日已过。实际上,Period 在比较时会正确处理:若当前年是平年,2 月 29 日不存在,系统会将其调整为 2 月 28 日进行比较。因此,在 2 月 28 日当天,年龄仍为上一岁的数值,直到 3 月 1 日才增加一岁,或者根据具体业务需求,可自定义逻辑将 2 月 28 日视为生日。标准库行为是:在平年的 2 月 28 日,对于 2 月 29 日出生的人,通常认为生日已过(视具体实现对“周年”的定义,Java 中 Period 会基于日期序列计算,2 月 29 日在平年被映射到 2 月 28 日时,若当前日期是 2 月 28 日,则视为同一天,年龄增加)。经测试,Period.between(LocalDate.of(2000,2,29), LocalDate.of(2023,2,28)) 返回 22 年,即 2 月 28 日算作生日已到。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











