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 fromDate
|
* @param toDate
|
* @return
|
*/
|
public static DateCompare dayCompare(Date fromDate,Date toDate,Date freeStart,Date freeEnd){
|
//开始时间往后延伸,除去有效时期
|
fromDate = DateUtil.addDaysToDate(fromDate,getIntersectingDays(fromDate,toDate,freeStart,freeEnd));
|
if(toDate.getTime()<= fromDate.getTime()){
|
return DateCompare.builder().day(0).month(0).year(0).yearFloat(new BigDecimal(0)).monthFloat(new BigDecimal(0)).build();
|
}
|
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){
|
yearFloat = yearFloat.add(new BigDecimal(yearDays).divide(new BigDecimal(365), 2,RoundingMode.FLOOR));
|
}
|
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));
|
}
|
return DateCompare.builder().day(day).month(month).year(year).yearFloat(yearFloat).monthFloat(monthFloat).yearDays(yearDays).monthDays(monthDays).build();
|
}
|
public static DateCompare monthYearCompare(Date fromDate,Date toDate ){
|
//开始时间往后延伸,除去有效时期
|
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){
|
yearFloat = yearFloat.add(new BigDecimal(yearDays).divide(new BigDecimal(365), 2,RoundingMode.FLOOR));
|
}
|
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));
|
}
|
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 ;
|
}
|
|
}
|