推荐使用 java 8 的 java.time api(如 localdate、period)计算员工入职周年,它线程安全、不可变、语义清晰;解析入职日期字符串为 localdate,用 period.between(hiredate, today).getyears() 获取整年数,并通过比对月日判断是否恰为周年纪念日。

Java 中计算员工入职周年,推荐使用 Java 8 引入的 java.time API(如 LocalDate、Period),它线程安全、不可变、语义清晰,避免了旧 API(Date、Calendar)的诸多缺陷。
获取入职日期与当前日期
假设员工入职日期以字符串形式存储(如 "2021-03-15"),需先解析为 LocalDate;当前日期直接用 LocalDate.now():
- 使用
DateTimeFormatter.ISO_LOCAL_DATE或自定义格式器解析字符串 - 确保入职日期早于等于今天,否则
Period.between()会返回负值(年/月/日均为负) - 示例:
LocalDate hireDate = LocalDate.parse("2021-03-15");<br>LocalDate today = LocalDate.now();
用 Period 计算完整周年数
Period.between(hireDate, today) 返回两个日期间的年、月、日差值,其中 getYears() 即为已满的入职周年数:
- 该方法按“日历单位”计算:只看年份差,再根据月份和日期判断是否满整年
- 例如:2021-03-15 到 2024-03-14 → 2 年(未满 3 周年);到 2024-03-15 → 正好 3 年
- 代码:
int years = Period.between(hireDate, today).getYears();
判断是否恰好是周年纪念日
若需精确判断“今天是否为入职整周年日”(如发通知或计算福利),不能只看年份差,还要比对月日:
- 检查
today.getMonth() == hireDate.getMonth() && today.getDayOfMonth() == hireDate.getDayOfMonth() - 更简洁的方式是用
!today.isBefore(hireDate.plusYears(years)) && !today.isAfter(hireDate.plusYears(years)),但直接比对月日更直观高效 - 注意:需先确保
hireDate不晚于today,否则逻辑不成立
处理跨闰年或月末日期的边界情况
LocalDate 和 Period 已自动处理闰年(如 2024-02-29 入职,2025-02-28 不满 1 年)及月末对齐(如 2023-01-31 入职,2023-02-28 视为满 1 个月):
- 无需手动调整——这是新 API 的优势
- 若业务要求“按自然月滚动”,可考虑用
YearMonth或结合TemporalAdjusters,但标准周年计算推荐坚持Period - 测试时建议覆盖:2 月 29 日、1 月 31 日、跨闰年等场景
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











