【JAVA】根据时间段,获取从开始时间到结束时间间隔月份中每个月的天数

本文介绍了一种计算两个日期之间的每个月份及其剩余天数的方法,通过递归算法和Calendar类,精确获取时间间隔,适用于需要按月统计业务数据的场景。

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

公司最近有个业务,根据开始时间和结束时间,获取中间的月份和天数。
实现起来并不复杂,在此做个记录:

封装的返回参数

class DayAndRemain{
   private String sdate;
   private String edate;
   private int remain;

    public DayAndRemain() {
    }

    public DayAndRemain(String sdate, String edate, int remain) {
        this.sdate = sdate;
        this.edate = edate;
        this.remain = remain;
    }

    public String getSdate() {
        return sdate;
    }

    public void setSdate(String sdate) {
        this.sdate = sdate;
    }

    public String getEdate() {
        return edate;
    }

    public void setEdate(String edate) {
        this.edate = edate;
    }

    public int getRemain() {
        return remain;
    }

    public void setRemain(int remain) {
        this.remain = remain;
    }

    @Override
    public String toString() {
        return "DayAndRemain{" +
                "sdate='" + sdate + '\'' +
                ", edate='" + edate + '\'' +
                ", remain=" + remain +
                '}';
    }
}

递归获取时间间隔的方法

    public static void getDaysOfMonth(String sdate,Date eDate,Date now ,SimpleDateFormat sdf, List<DayAndRemain> dayAndRemains) throws Exception{
         Date sDate = sdf.parse(sdate);
        if(now!=null){
            if(eDate.after(now))eDate = now;//如果now传值且结束时间大于当前时间则取结束时间为当前时间
            if(sDate.after(now))return;//如果开始时间大于结束时间或者大于当前时间,方法结束
        }
        if(eDate.before(sDate)) return ;
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(sDate);
        int daysRemain = calendar.getActualMaximum(Calendar.DAY_OF_MONTH) - calendar.get(Calendar.DAY_OF_MONTH) + 1;//剩余天数
        calendar.add(calendar.DATE,daysRemain-1);
        Date eDateTemp = calendar.getTime();
        String edate = sdf.format(eDateTemp);
        if(eDateTemp.after(eDate)){ //计算的结束时间已经超过了实际的结束时间,则获取实际结束时间的剩余天数相减
            Calendar eCalendar = Calendar.getInstance();
            eCalendar.setTime(eDate);
            int eDaysRemain = eCalendar.getActualMaximum(Calendar.DAY_OF_MONTH) - eCalendar.get(Calendar.DAY_OF_MONTH);//剩余天数
            daysRemain = daysRemain - eDaysRemain;
            edate = sdf.format(eDate);
        }
        if(daysRemain == 1 && dayAndRemains.size() > 0 ) return;
        dayAndRemains.add(new DayAndRemain(sdate,edate,daysRemain));
        calendar.add(calendar.DATE,1);
        getDaysOfMonth(sdf.format(calendar.getTime()), eDate,now,sdf,dayAndRemains);
    }

调用方法:

/**
         *
         * @param sdate 开始时间
         * @param edata 结束时间
         * @param formatter 转换格式
         * @param startNow  是否使用当前时间做限制
         * @return
         * @throws Exception
         */
    private static  List<DayAndRemain>  calculationDayAndRemain(String sdate,String edata,String formatter,boolean startNow)  throws Exception{
            List<DayAndRemain> dayAndRemains = new ArrayList<>();
            SimpleDateFormat sdf = new SimpleDateFormat(formatter);
            getDaysOfMonth(sdate, sdf.parse(edata),startNow?new Date():null,sdf,dayAndRemains);
            for (DayAndRemain dayAndRemain : dayAndRemains) {
                System.out.println(dayAndRemain);
            }
            return dayAndRemains;
        }

主程序:

public static void main(String[] args) throws Exception {
        String sdate ="20190630";
        String edata ="20190831";
        String formatter ="yyyyMMdd";
        calculationDayAndRemain(sdate,edata,formatter,true);
    }

输出:
在这里插入图片描述

以上为精简例子,希望可以帮到你

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值