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 ; } }