|  |  | 
 |  |  |      *                                以年为单位相差为:6年 | 
 |  |  |      *                                以月为单位相差为:73个月 | 
 |  |  |      *                                以日为单位相差为:2220天 | 
 |  |  |      * @param fromDate | 
 |  |  |      * @param toDate | 
 |  |  |      * @param toDateOrigin | 
 |  |  |      * @return | 
 |  |  |      */ | 
 |  |  |     public static DateCompare dayCompare(Date fromDate,Date toDate,Date freeStart,Date freeEnd){ | 
 |  |  |     public static DateCompare dayCompare(Date fromDateOrigin,Date toDateOrigin,Date freeStart,Date freeEnd){ | 
 |  |  |         //开始时间往后延伸,除去有效时期 | 
 |  |  |         fromDate = DateUtil.addDaysToDate(fromDate,getIntersectingDays(fromDate,toDate,freeStart,freeEnd)); | 
 |  |  |         if(toDate.getTime()<= fromDate.getTime()){ | 
 |  |  |         Date fromDate = DateUtil.addDaysToDate(fromDateOrigin,getIntersectingDays(fromDateOrigin,DateUtil.addDaysToDate(toDateOrigin,1), | 
 |  |  |                 freeStart, | 
 |  |  |                 Objects.isNull(freeEnd)?null:DateUtil.addDaysToDate(freeEnd,1)) | 
 |  |  |         ); | 
 |  |  |         if(toDateOrigin.getTime()<  fromDate.getTime()){ | 
 |  |  |             return DateCompare.builder().day(0).month(0).year(0).yearFloat(new BigDecimal(0)).monthFloat(new BigDecimal(0)).build(); | 
 |  |  |         } | 
 |  |  |         Date toDate =DateUtil.addDaysToDate(toDateOrigin, 1); | 
 |  |  | //        toDate = DateUtil.addDaysToDate(toDate,1);//包含截止日期 | 
 |  |  |         Calendar  from  =  Calendar.getInstance(); | 
 |  |  |         from.setTime(fromDate); | 
 |  |  |         Calendar  to  =  Calendar.getInstance(); | 
 |  |  | 
 |  |  |  | 
 |  |  |         int year = toYear  -  fromYear; | 
 |  |  |         int month = toYear *  12  + toMonth  -  (fromYear  *  12  +  fromMonth); | 
 |  |  |         int day = (int) ((to.getTimeInMillis()  -  from.getTimeInMillis())  /  (24  *  3600  *  1000)); | 
 |  |  |         int day = DateUtil.daysBetweenDates( toDate,fromDate); | 
 |  |  |         BigDecimal yearFloat = new BigDecimal(year) ; | 
 |  |  |         BigDecimal monthFloat = new BigDecimal(month) ; | 
 |  |  |  | 
 |  |  |         int yearDays = day - DateUtil.daysBetweenDates(DateUtil.addYearToDate(fromDate,year),fromDate) ; | 
 |  |  |         if(yearDays>0){ | 
 |  |  |             yearFloat = yearFloat.add(new BigDecimal(yearDays).divide(new BigDecimal(365), 2,RoundingMode.FLOOR)); | 
 |  |  |         int yearDays = day - (DateUtil.daysBetweenDates(DateUtil.addYearToDate(fromDate,year),fromDate)); | 
 |  |  |         if(yearDays!=0){ | 
 |  |  |             if(yearDays <0){ | 
 |  |  |                 year = year-1; | 
 |  |  |                 yearFloat = new BigDecimal(year) ; | 
 |  |  |                 yearDays =DateUtil.daysBetweenDates(toDate,DateUtil.addYearToDate(fromDate,year)); | 
 |  |  |             } | 
 |  |  |             yearFloat = yearFloat.add(new BigDecimal(1.0*yearDays).divide(new BigDecimal(365.0), 15,RoundingMode.HALF_UP)); | 
 |  |  |         } | 
 |  |  |         int monthDays = day - DateUtil.daysBetweenDates(DateUtil.addMonthToDate(fromDate,month),fromDate) ; | 
 |  |  |         if(monthDays>0){ | 
 |  |  |             monthFloat = monthFloat.add(new BigDecimal(monthDays).divide(new BigDecimal(30), 2,RoundingMode.FLOOR)); | 
 |  |  |         int monthDays = day - (DateUtil.daysBetweenDates(DateUtil.addMonthToDate(fromDate,month),fromDate)) ; | 
 |  |  |         if(monthDays!=0){ | 
 |  |  |             if(monthDays <0){ | 
 |  |  |                 month = month-1; | 
 |  |  |                 monthFloat = new BigDecimal(month) ; | 
 |  |  |                 monthDays =DateUtil.daysBetweenDates(toDate,DateUtil.addMonthToDate(fromDate,month)); | 
 |  |  |             } | 
 |  |  |             monthFloat = monthFloat.add(new BigDecimal(1.0*monthDays*12).divide(new BigDecimal(365.0), 15,RoundingMode.HALF_UP)); | 
 |  |  |         } | 
 |  |  |         return DateCompare.builder().day(day).month(month).year(year).yearFloat(yearFloat).monthFloat(monthFloat).yearDays(yearDays).monthDays(monthDays).build(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static void main(String[] args) { | 
 |  |  |         DateCompare dateCompare =   DateCompare.dayCompare(DateUtil.getDateFromString("2025-03-01 00:00:00"),DateUtil.getDateByString("2025-05-31 00:00:00") | 
 |  |  |                 ,null,null); | 
 |  |  |         DateCompare dateCompare =   DateCompare.monthYearCompare(DateUtil.getDateFromString("2025-06-03 00:00:00"),DateUtil.getDateByString("2025-09-02 00:00:00") ); | 
 |  |  |         System.out.println(dateCompare.day); | 
 |  |  |         System.out.println(dateCompare.monthDays); | 
 |  |  |         System.out.println(dateCompare.month); | 
 |  |  |         System.out.println(dateCompare.monthFloat); | 
 |  |  |         System.out.println("=========year============="); | 
 |  |  |         System.out.println(dateCompare.yearDays); | 
 |  |  |         System.out.println(dateCompare.year); | 
 |  |  |         System.out.println(dateCompare.yearFloat); | 
 |  |  |     } | 
 |  |  |     public static DateCompare monthYearCompare(Date fromDate,Date toDate ){ | 
 |  |  |     public static DateCompare monthYearCompare(Date fromDate,Date toDateOrigin ){ | 
 |  |  |         //开始时间往后延伸,除去有效时期 | 
 |  |  |         Date toDate =DateUtil.addDaysToDate(toDateOrigin, 1); | 
 |  |  |         Calendar  from  =  Calendar.getInstance(); | 
 |  |  |         from.setTime(fromDate); | 
 |  |  |         Calendar  to  =  Calendar.getInstance(); | 
 |  |  | 
 |  |  |         BigDecimal yearFloat = new BigDecimal(year) ; | 
 |  |  |         BigDecimal monthFloat = new BigDecimal(month) ; | 
 |  |  |  | 
 |  |  |         int yearDays = day - DateUtil.daysBetweenDates(DateUtil.addYearToDate(fromDate,year),fromDate) ; | 
 |  |  |         if(yearDays>0){ | 
 |  |  |             yearFloat = yearFloat.add(new BigDecimal(yearDays).divide(new BigDecimal(365), 2,RoundingMode.FLOOR)); | 
 |  |  |         int yearDays = day - (DateUtil.daysBetweenDates(DateUtil.addYearToDate(fromDate,year),fromDate)); | 
 |  |  |         if(yearDays!=0){ | 
 |  |  |             if(yearDays <0){ | 
 |  |  |                 year = year-1; | 
 |  |  |                 yearFloat = new BigDecimal(year) ; | 
 |  |  |                 yearDays =DateUtil.daysBetweenDates(toDate,DateUtil.addYearToDate(fromDate,year)); | 
 |  |  |             } | 
 |  |  |             yearFloat = yearFloat.add(new BigDecimal(1.0*yearDays).divide(new BigDecimal(365.0), 15,RoundingMode.HALF_UP)); | 
 |  |  |         } | 
 |  |  |         int monthDays = day - DateUtil.daysBetweenDates(DateUtil.addMonthToDate(fromDate,month),fromDate) ; | 
 |  |  |         if(monthDays>0){ | 
 |  |  |             monthFloat = monthFloat.add(new BigDecimal(monthDays).divide(new BigDecimal(30), 2,RoundingMode.FLOOR)); | 
 |  |  |         int monthDays = day - (DateUtil.daysBetweenDates(DateUtil.addMonthToDate(fromDate,month),fromDate)) ; | 
 |  |  |         if(monthDays!=0){ | 
 |  |  |             if(monthDays <0){ | 
 |  |  |                 month = month-1; | 
 |  |  |                 monthFloat = new BigDecimal(month) ; | 
 |  |  |                 monthDays =DateUtil.daysBetweenDates(toDate,DateUtil.addMonthToDate(fromDate,month)); | 
 |  |  |             } | 
 |  |  |             monthFloat = monthFloat.add(new BigDecimal(1.0*monthDays*12).divide(new BigDecimal(365.0), 15,RoundingMode.HALF_UP)); | 
 |  |  |         } | 
 |  |  |         return DateCompare.builder().day(day).month(month).year(year).yearFloat(yearFloat).monthFloat(monthFloat).yearDays(yearDays).monthDays(monthDays).build(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static int getIntersectingDays(Date start1, Date end1, Date start2, Date end2) { | 
 |  |  |         if(Objects.isNull(start2)||Objects.isNull(end2)){ | 
 |  |  |             return 0; | 
 |  |  |         } | 
 |  |  |         Date earlierStart = DateUtil.daysBetweenDates(start1,start2)>0? start1 : start2; | 
 |  |  |         Date laterEnd =  DateUtil.daysBetweenDates(end2,end1)>0 ? end1 : end2; | 
 |  |  |  | 
 |  |  |         int days =DateUtil.daysBetweenDates(laterEnd,earlierStart ); | 
 |  |  |         int days =DateUtil.daysBetweenDates(laterEnd,earlierStart); | 
 |  |  |         return days>0?days:0 ; | 
 |  |  |     } | 
 |  |  |  |