java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java
@@ -1925,19 +1925,19 @@ //在当前月中 这块有问题 if (toDate.getTime() < newFromMaxDay.getTime().getTime()) { monthDay = new BigDecimal(newFrom.getActualMaximum(Calendar.DAY_OF_MONTH)); return tmpDays.divide(monthDay, 2, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).doubleValue(); 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, 2, BigDecimal.ROUND_HALF_UP); 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, 2, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).add(preRresMonth).doubleValue(); resMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result)).add(preRresMonth).doubleValue(); return resMonth; } @@ -2233,7 +2233,7 @@ BigDecimal curFeePrice = new BigDecimal(feeDto.getFeePrice()); if (feeDto.getEndTime().getTime() < rateStartTime.getTime()) { curOweMonth = dayCompare(feeDto.getEndTime(), rateStartTime); oweAmountDec = curFeePrice.multiply(new BigDecimal(curOweMonth)).setScale(2, BigDecimal.ROUND_HALF_UP); oweAmountDec = curFeePrice.multiply(new BigDecimal(curOweMonth)).setScale(4, BigDecimal.ROUND_HALF_UP); } curOweMonth = dayCompare(rateStartTime, feeDto.getDeadlineTime()); @@ -2250,7 +2250,7 @@ Date curEndTime = null; for (int cycleIndex = 0; cycleIndex < maxCycle; cycleIndex++) { //当期增长部分 rateDec = preCycleAmount.multiply(new BigDecimal(rate)).setScale(2, BigDecimal.ROUND_HALF_UP); rateDec = preCycleAmount.multiply(new BigDecimal(rate)).setScale(4, BigDecimal.ROUND_HALF_UP); //增长周期的倍数 curCycle = (cycleIndex + 1) * rateCycle; @@ -2261,8 +2261,8 @@ curEndTime = curEndTimeCalender.getTime(); if (curCycle > curOweMonth) { //不足增长周期增长率 rateDec = new BigDecimal(curOweMonth / rateCycle - Math.floor(curOweMonth / rateCycle)).multiply(rateDec).setScale(2, BigDecimal.ROUND_HALF_UP); lastRateAmountDec = new BigDecimal(curOweMonth / rateCycle - Math.floor(curOweMonth / rateCycle)).multiply(preCycleAmount).setScale(2, BigDecimal.ROUND_HALF_UP); rateDec = new BigDecimal(curOweMonth / rateCycle - Math.floor(curOweMonth / rateCycle)).multiply(rateDec).setScale(4, BigDecimal.ROUND_HALF_UP); lastRateAmountDec = new BigDecimal(curOweMonth / rateCycle - Math.floor(curOweMonth / rateCycle)).multiply(preCycleAmount).setScale(4, BigDecimal.ROUND_HALF_UP); addTotalAmount = addTotalAmount.add(rateDec).add(lastRateAmountDec); continue; } service-user/src/test/java/com/java110/user/AppTest.java
@@ -1,8 +1,13 @@ package com.java110.user; import com.java110.utils.util.DateUtil; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; import java.math.BigDecimal; import java.util.Calendar; import java.util.Date; /** * Unit test for simple App. @@ -33,7 +38,71 @@ */ public void testApp() { Date startTime = DateUtil.getDateFromStringB("2022-07-01"); Date endTime = DateUtil.getDateFromStringB("2022-07-27"); double month = dayCompare(startTime,endTime); System.out.println(month); } /** * 计算 两个时间点月份 * * @param fromDate 开始时间 * @param toDate 结束时间 * @return */ public double dayCompare(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; } }