package com.java110.user; import com.java110.doc.annotation.Java110HeaderDoc; import com.java110.doc.annotation.Java110ParamsDoc; import com.java110.user.cmd.login.PcUserLoginCmd; import com.java110.utils.util.DateUtil; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import org.springframework.core.annotation.AnnotationUtils; import java.lang.annotation.Annotation; import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; /** * Unit test for simple App. */ public class AppTest extends TestCase { /** * Create the test case * * @param testName name of the test case */ public AppTest( String testName ) { super( testName ); } /** * @return the suite of tests being tested */ public static Test suite() { return new TestSuite( AppTest.class ); } public void testSplit(){ Class clazz = PcUserLoginCmd.class; Java110ParamsDoc java110ParamsDoc = AnnotationUtils.findAnnotation(clazz,Java110ParamsDoc.class); Java110HeaderDoc[] java110HeaderDocs = java110ParamsDoc.headers(); System.out.println(123); } /** * Rigourous Test :-) */ public void testApp() { Date startTime = DateUtil.getDateFromStringA("2023-12-02 22:00:00"); Date endTime = DateUtil.getDateFromStringB("2024-03-01"); double month = dayCompare(startTime,endTime); System.out.println(month * 129.13 * 2.4); } public static double dayCompare(Date fromDate, Date toDate) { //todo 需要计算三端时间 相加即可 Date fromDateFirstDate = fromDate; // 第一个1日 Date toDateFirstDate = toDate; // 最后一个1日 boolean firstDay = true; //todo 1.0 计算 fromDateFirstDate Calendar fromDateCal = Calendar.getInstance(); fromDateCal.setTime(fromDate); fromDateCal.set(Calendar.DAY_OF_MONTH, 1); fromDateCal.set(Calendar.HOUR_OF_DAY,0); fromDateCal.set(Calendar.MINUTE,0); if (fromDate.getTime() > fromDateCal.getTime().getTime()) { fromDateCal.add(Calendar.MONTH, 1); firstDay = false; fromDateFirstDate = fromDateCal.getTime(); } //todo 2.0 计算 toDateFirstDate Calendar toDateCal = Calendar.getInstance(); toDateCal.setTime(toDate); toDateCal.set(Calendar.DAY_OF_MONTH, 1); toDateCal.set(Calendar.HOUR_OF_DAY,0); toDateCal.set(Calendar.MINUTE,0); if (toDate.getTime() > toDateCal.getTime().getTime()) { toDateFirstDate = toDateCal.getTime(); } // todo 3.0 计算整数月 fromDateFirstDate ---> toDateFirstDate Calendar from = Calendar.getInstance(); from.setTime(fromDateFirstDate); Calendar to = Calendar.getInstance(); to.setTime(toDateFirstDate); //比较月份差 可能有整数 也会负数 int result = to.get(Calendar.MONTH) - from.get(Calendar.MONTH); //比较年差 int month = (to.get(Calendar.YEAR) - from.get(Calendar.YEAR)) * 12; //真实 相差月份 result = result + month; //todo 3.1 如果 fromDate 和toDate 是同一天 则直接返回整月,不再计算 4.0 和5.0 if (DateUtil.sameMonthDay(fromDate, toDate)) { return firstDay ? result : result + 1; } // todo 4.0 计算 fromDate ---> fromDateFirstDate 的月份 double days = (fromDateFirstDate.getTime() - fromDate.getTime()) * 1.00 / (24 * 60 * 60 * 1000); BigDecimal tmpDays = new BigDecimal(days); //相差天数 BigDecimal monthDay = new BigDecimal(DateUtil.getMonthDay(fromDate)); BigDecimal resMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)); // todo 5.0 计算 toDateFirstDate ----> toDate 月份 days = (toDate.getTime() - toDateFirstDate.getTime()) * 1.00 / (24 * 60 * 60 * 1000); tmpDays = new BigDecimal(days); //相差天数 monthDay = new BigDecimal(DateUtil.getMonthDay(toDate)); resMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(resMonth); return resMonth.doubleValue(); } /** * 计算 两个时间点月份 * * @param fromDate 开始时间 * @param toDate 结束时间 * @return */ public double dayCompare1(Date fromDate, Date toDate) { double resMonth = 0.0; Calendar from = Calendar.getInstance(); from.setTime(fromDate); Calendar to = Calendar.getInstance(); to.setTime(toDate); //比较月份差 可能有整数 也会负数 int result = to.get(Calendar.MONTH) - from.get(Calendar.MONTH); //比较年差 int month = (to.get(Calendar.YEAR) - from.get(Calendar.YEAR)) * 12; //真实 相差月份 result = result + month; //开始时间 2021-06-01 2021-08-05 result = 2 2021-08-01 Calendar newFrom = Calendar.getInstance(); newFrom.setTime(fromDate); newFrom.add(Calendar.MONTH, result); //如果加月份后 大于了当前时间 默认加 月份 -1 情况 12-19 21-01-10 //这个是神的逻辑一定好好理解 if (newFrom.getTime().getTime() > toDate.getTime()) { newFrom.setTime(fromDate); result = result - 1; newFrom.add(Calendar.MONTH, result); } // t1 2021-08-01 t2 2021-08-05 long t1 = newFrom.getTime().getTime(); long t2 = to.getTime().getTime(); //相差毫秒 double days = (t2 - t1) * 1.00 / (24 * 60 * 60 * 1000); BigDecimal tmpDays = new BigDecimal(days); //相差天数 BigDecimal monthDay = null; Calendar newFromMaxDay = Calendar.getInstance(); newFromMaxDay.set(newFrom.get(Calendar.YEAR), newFrom.get(Calendar.MONTH), 1, 0, 0, 0); newFromMaxDay.add(Calendar.MONTH, 1); //下个月1号 //在当前月中 这块有问题 if (toDate.getTime() < newFromMaxDay.getTime().getTime()) { monthDay = new BigDecimal(newFrom.getActualMaximum(Calendar.DAY_OF_MONTH)); return tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).doubleValue(); } // 上月天数 days = (newFromMaxDay.getTimeInMillis() - t1) * 1.00 / (24 * 60 * 60 * 1000); tmpDays = new BigDecimal(days); monthDay = new BigDecimal(newFrom.getActualMaximum(Calendar.DAY_OF_MONTH)); BigDecimal preRresMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP); //下月天数 days = (t2 - newFromMaxDay.getTimeInMillis()) * 1.00 / (24 * 60 * 60 * 1000); tmpDays = new BigDecimal(days); monthDay = new BigDecimal(newFromMaxDay.getActualMaximum(Calendar.DAY_OF_MONTH)); resMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).add(preRresMonth).doubleValue(); return resMonth; } }