一、计算规则
从2025年1月1日起,男职工和原法定退休年龄为五十五周岁的女职工,法定退休年龄每四个月延迟一个月,分别逐步延迟至六十三周岁和五十八周岁;原法定退休年龄为五十周岁的女职工,法定退休年龄每二个月延迟一个月,逐步延迟至五十五周岁。国家另有规定的,从其规定。
原文链接:全国人民代表大会常务委员会关于实施渐进式延迟法定退休年龄的决定
二、编码实现:
import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;
import lombok.Data;
/**
*
* <p>
* 从2025年1月1日起,男职工和原法定退休年龄为五十五周岁的女职工,法定退休年龄每四个月延迟一个月,分别逐步延迟至六十三周岁和五十八周岁;</>
* <p>
* 原法定退休年龄为五十周岁的女职工,法定退休年龄每二个月延迟一个月,逐步延迟至五十五周岁。国家另有规定的,从其规定。</>
*
* @author lidongyang
* @date 2024/9/14 08:46
* @since V1.0.0
*/
public class RetirementAgeCalculator {
public static void main(String[] args) {
LocalDate birthDate = LocalDate.of(1990, 10, 10);
// 示例原退休年龄
int oldRetirementAge = 60;
RetirementInfo retirementInfo = calculateNewRetirement(birthDate, oldRetirementAge);
System.out.println("新的退休年龄: " + retirementInfo.getRetirementAge());
System.out.println("预计退休日期: " + retirementInfo.getRetirementDate());
System.out.println("延迟的月数: " + retirementInfo.getDelayMonth() + "个月");
System.out.println(
"距离退休还有: " + (ChronoUnit.DAYS.between(LocalDate.now(), retirementInfo.getRetirementDate())-1) + "天");
}
/**
* 计算新的退休信息
*
* @param birthDate
* @param oldRetirementAge
* @return
*/
private static RetirementInfo calculateNewRetirement(LocalDate birthDate, int oldRetirementAge) {
RetirementInfo retirementInfo = new RetirementInfo();
LocalDate startDelayDate = LocalDate.of(2025, 1, 1);
// 计算原退休日期
LocalDate oldRetirementDate = birthDate.plusYears(oldRetirementAge);
// 计算新的退休日期 超过原退休日期后新的退休日期每隔四个月加一个月,直到加满36个月截止
LocalDate newRetirementDate;
// 延迟月份
int monthsToDelay = 0;
// 最大延迟月份数
int maxMonthsToDelay = 36;
// 被除数
// 男职工和原法定退休年龄为五十五周岁的女职工,法定退休年龄每四个月延迟一个月
int dividend = 4;
if (oldRetirementAge == 50) {
// 原法定退休年龄为五十周岁的女职工,法定退休年龄每二个月延迟一个月
dividend = 2;
maxMonthsToDelay = 60;
}
// 如果原退休日期在延迟开始日期之前,则使用原退休日期
if (oldRetirementDate.isBefore(startDelayDate)) {
newRetirementDate = oldRetirementDate;
} else {
// 计算超过起始延迟日期后需要增加的月份数
Period period = Period.between(startDelayDate, oldRetirementDate);
int monthsToAdd = period.getYears() * 12 + period.getMonths() + 1;
// 每过四个月加一个月
monthsToDelay = monthsToAdd / dividend;
int remainder = monthsToAdd % dividend;
if (remainder != 0) {
monthsToDelay++;
}
if (monthsToDelay > maxMonthsToDelay) {
monthsToDelay = maxMonthsToDelay;
}
// 原退休日期+延迟退休的月份
newRetirementDate = oldRetirementDate.plusMonths(monthsToDelay);
}
retirementInfo.setDelayMonth(monthsToDelay);
retirementInfo.setRetirementDate(newRetirementDate.withDayOfMonth(birthDate.getDayOfMonth()));
// 计算退休年龄
int age = Period.between(birthDate, newRetirementDate).getYears();
int month = Period.between(birthDate, newRetirementDate).getMonths() % 12;
retirementInfo.setRetirementAge(String.format("%s岁%s个月", age, month));
return retirementInfo;
}
}
@Data
class RetirementInfo {
private String retirementAge;
private Integer delayMonth;
private LocalDate retirementDate;
}
三、运行结果
运行结果与对照表一致