package com.doumee.core.utils; 
 | 
  
 | 
  
 | 
import lombok.Builder; 
 | 
import lombok.Data; 
 | 
import org.apache.commons.lang3.StringUtils; 
 | 
  
 | 
import java.math.BigDecimal; 
 | 
import java.math.RoundingMode; 
 | 
import java.sql.Timestamp; 
 | 
import java.text.DateFormat; 
 | 
import java.text.DateFormatSymbols; 
 | 
import java.text.ParseException; 
 | 
import java.text.SimpleDateFormat; 
 | 
import java.time.*; 
 | 
import java.time.temporal.ChronoUnit; 
 | 
import java.time.temporal.TemporalAdjusters; 
 | 
import java.util.Date; 
 | 
import java.util.*; 
 | 
  
 | 
/** 
 | 
 * 日期工具类 
 | 
 * @author: jiangping 
 | 
 * @date:   2021年7月21日09:27:13 
 | 
 */ 
 | 
@Builder 
 | 
@Data 
 | 
public class DateCompare { 
 | 
    private int year; 
 | 
    private int month; 
 | 
    private int day; 
 | 
    private BigDecimal yearFloat; 
 | 
    private BigDecimal monthFloat; 
 | 
    private int yearDays  ; 
 | 
    private int monthDays ; 
 | 
    /** 
 | 
     * 计算2个日期之间相差的  以年、月、日为单位,各自计算结果是多少 
 | 
     * 比如:2011-02-02 到  2017-03-02 
 | 
     *                                以年为单位相差为:6年 
 | 
     *                                以月为单位相差为:73个月 
 | 
     *                                以日为单位相差为:2220天 
 | 
     * @param toDateOrigin 
 | 
     * @return 
 | 
     */ 
 | 
    public static DateCompare dayCompare(Date fromDateOrigin,Date toDateOrigin,Date freeStart,Date freeEnd){ 
 | 
        //开始时间往后延伸,除去有效时期 
 | 
        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(); 
 | 
        to.setTime(toDate); 
 | 
        //只要年月 
 | 
        int fromYear = from.get(Calendar.YEAR); 
 | 
        int fromMonth = from.get(Calendar.MONTH); 
 | 
  
 | 
        int toYear = to.get(Calendar.YEAR); 
 | 
        int toMonth = to.get(Calendar.MONTH); 
 | 
  
 | 
        int year = toYear  -  fromYear; 
 | 
        int month = toYear *  12  + toMonth  -  (fromYear  *  12  +  fromMonth); 
 | 
        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){ 
 | 
            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){ 
 | 
            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.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 toDateOrigin ){ 
 | 
        //开始时间往后延伸,除去有效时期 
 | 
        Date toDate =DateUtil.addDaysToDate(toDateOrigin, 1); 
 | 
        Calendar  from  =  Calendar.getInstance(); 
 | 
        from.setTime(fromDate); 
 | 
        Calendar  to  =  Calendar.getInstance(); 
 | 
        to.setTime(toDate); 
 | 
        //只要年月 
 | 
        int fromYear = from.get(Calendar.YEAR); 
 | 
        int fromMonth = from.get(Calendar.MONTH); 
 | 
  
 | 
        int toYear = to.get(Calendar.YEAR); 
 | 
        int toMonth = to.get(Calendar.MONTH); 
 | 
  
 | 
        int year = toYear  -  fromYear; 
 | 
        int month = toYear *  12  + toMonth  -  (fromYear  *  12  +  fromMonth); 
 | 
        int day = (int) ((to.getTimeInMillis()  -  from.getTimeInMillis())  /  (24  *  3600  *  1000)); 
 | 
        BigDecimal yearFloat = new BigDecimal(year) ; 
 | 
        BigDecimal monthFloat = new BigDecimal(month) ; 
 | 
  
 | 
        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){ 
 | 
            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); 
 | 
        return days>0?days:0 ; 
 | 
    } 
 | 
  
 | 
} 
 |