JAVA计算工龄、计算日期相差多少年多少月多少天,计算时间差,计算日期年月日

该代码实现了一个用于计算工龄的Java类`WorkYearForm`,考虑了平年闰年及单月双月的情况。通过输入开始和结束时间,可以计算出精确的年、月、天数。核心方法使用`ChronoUnit`计算月数,然后调整天数以确保精度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不废话,直接上代码

package com.assoft.hrms.common.form;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.Temporal;
import java.util.Calendar;
import java.util.Date;

/**
 * 计算工龄v4.0
 * 2023年5月29日优化
 * 计算工龄时需考虑平年闰年、单月双月!!!
 */
public class WorkYearForm {

    private final String DATE_FORMAT = "yyyyMMddHHmmss";//默认日期格式
    private long year = 0;
    private long month = 0;
    private long day = 0;

    public WorkYearForm() {

    }

    public WorkYearForm(long year, long month, long day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    /**
     * 核心方法
     * @param startTime 开始时间 20230101000000
     * @param endTime 结束时间 20230529000000
     */
    public WorkYearForm(String startTime, String endTime) {
        try {
            DateTimeFormatter dtf = DateTimeFormatter.ofPattern(DATE_FORMAT);
            Temporal temporal1 = LocalDate.parse(startTime, dtf);
            Temporal temporal2 = LocalDate.parse(endTime, dtf);

            Calendar startCalendar = time2Calendar(startTime);
            Calendar endCalendar = time2Calendar(endTime);

            //求总月数,开始时间都按照每月1号计算
            long monthTotal = ChronoUnit.MONTHS.between(temporal1, temporal2);
            //求出开始月份有多少天
            int startMonthDay = loadMonthDay(startCalendar);


            //距离当月1号相差多少天
            int startDay = startCalendar.get(Calendar.DAY_OF_MONTH);
            //距离当月1号相差多少天
            int endDay = endCalendar.get(Calendar.DAY_OF_MONTH);
            //多余天数
            long dayCount = endDay - startDay;
            if (endDay < startDay) {
                //相减为复数时,反推多余天数(这三行代码可能比较绕)
                dayCount = startMonthDay - startDay + endDay;
            }

            //多余天数%30才是实际多出来的天数  多余天数/开始月天数 = 多出来的月数
            if (dayCount / startMonthDay > 0) {
                //满monthDay进1
                monthTotal = monthTotal + dayCount / startMonthDay;
                dayCount = dayCount % startMonthDay;
            }

            //根据总月数,求年数
            long yearCount = monthTotal / 12;
            //根据年数求月余数
            long monthCount = monthTotal % 12;

            this.year = yearCount;
            this.month = monthCount;
            this.day = dayCount;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    private Calendar time2Calendar(String time) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat(this.DATE_FORMAT);
        Date date = sdf.parse(time);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar;
    }

    /**
     * 求某月有多少天
     * @return
     */
    private int loadMonthDay(Calendar calendar) {
        //求最后一个月有多少天
        int monthDay = 30;//每个月多少天
        //顺序不能乱,必须放这里 TODO看看需不需要+1
        int month = calendar.get(Calendar.MONTH) + 1;
        if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
            monthDay = 31;
        } else if (month == 2) {
            int year = calendar.get(Calendar.YEAR);
            //计算平年/闰年
            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
                //闰年:能被4整除 但不能被100整除 || 能被400整除
                monthDay = 29;
            } else {
                //平年
                monthDay = 28;
            }
        }
        return monthDay;
    }


    public long getYear() {
        return year;
    }

    public void setYear(long year) {
        this.year = year;
    }

    public long getMonth() {
        return month;
    }

    public void setMonth(long month) {
        this.month = month;
    }

    public long getDay() {
        return day;
    }

    public void setDay(long day) {
        this.day = day;
    }
}

如何使用?直接上代码

public static void main(String[] args) throws IOException, ParseException {
    String startTime = "20230121000000";
    String endTime = "20230301000000";
    WorkYearForm workYearForm = new WorkYearForm(startTime, endTime);
    long year = workYearForm.getYear();
    long month = workYearForm.getMonth();
    long day = workYearForm.getDay();
    String str = year+"年"+month+"月"+day+"天";
    System.out.println(str);//输出结果0年1月11天
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值