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,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) {
|
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 ;
|
}
|
|
}
|