java实现根据延迟法定退休政策计算退休年龄

一、计算规则

从2025年1月1日起,男职工和原法定退休年龄为五十五周岁的女职工,法定退休年龄每四个月延迟一个月,分别逐步延迟至六十三周岁和五十八周岁;原法定退休年龄为五十周岁的女职工,法定退休年龄每二个月延迟一个月,逐步延迟至五十五周岁。国家另有规定的,从其规定。

原文链接:全国人民代表大会常务委员会关于实施渐进式延迟法定退休年龄的决定

二、编码实现:

import lombok.Data;
import java.time.LocalDate;
import java.time.Period;
import java.time.temporal.ChronoUnit;

/**
 * <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(1965, 1, 31);
        // 示例原退休年龄
        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
     */
    public 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);

        // 计算退休年龄,精确到月,设置为1号是为了解决非闰年没有2月29号的问题
        int age = Period.between(birthDate.withDayOfMonth(1), newRetirementDate.withDayOfMonth(1)).getYears();
        int month = Period.between(birthDate.withDayOfMonth(1), newRetirementDate.withDayOfMonth(1)).getMonths() % 12;

        retirementInfo.setRetirementAge(String.format("%s岁%s个月", age, month));
        if (month == 0 || age >= 63) {
            retirementInfo.setRetirementAge(String.format("%s岁", age));
        }

        return retirementInfo;
    }

    /**
     * 判断是否是闰年,非闰年2月只有28天
     *
     * @param year
     * @return
     */
    private static boolean checkLeapYear(int year) {
        if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
            return true;
        } else {
            return false;
        }
    }
}



@Data
class RetirementInfo {
    private String retirementAge;
    private Integer delayMonth;
    private LocalDate retirementDate;
}

三、运行结果

运行结果与对照表一致

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值