Explorar el Código

优化算费bug

wuxw hace 2 años
padre
commit
9b39254d11

+ 109 - 54
java110-utils/src/main/java/com/java110/utils/util/DateUtil.java

@@ -829,76 +829,131 @@ public class DateUtil {
         return false;
     }
 
-    /**
-     * 计算 fromDate 2023-01-12  toDate 2023-09-15
-     * 2023-01-12--->2023-01-01        --->  2023-09-01    ------> 2023-09-15
-     * fromDate ---> fromDateFirstDate --->  toDateFirstDate ----> toDate
-     *
-     * @param fromDate
-     * @param toDate
-     * @return
-     */
     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);
-        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);
-        if (toDate.getTime() > toDateCal.getTime().getTime()) {
-            toDateFirstDate = toDateCal.getTime();
-        }
-
-        // todo 3.0 计算整数月  fromDateFirstDate --->  toDateFirstDate
+        double resMonth = 0.0;
         Calendar from = Calendar.getInstance();
-        from.setTime(fromDateFirstDate);
+        from.setTime(fromDate);
         Calendar to = Calendar.getInstance();
-        to.setTime(toDateFirstDate);
+        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;
 
-        //todo 3.1  如果 fromDate 和toDate 是同一天 则直接返回整月,不再计算 4.0 和5.0
-        if (DateUtil.sameMonthDay(fromDate, toDate)) {
-            return firstDay ? result : result + 1;
+        //开始时间  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);
         }
 
-        // todo 4.0 计算 fromDate ---> fromDateFirstDate 的月份
-        double days = (fromDateFirstDate.getTime() - fromDate.getTime()) * 1.00 / (24 * 60 * 60 * 1000);
+        // 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 = 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();
+        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;
     }
 
+    /**
+     * 计算 fromDate 2023-01-12  toDate 2023-09-15
+     * 2023-01-12--->2023-01-01        --->  2023-09-01    ------> 2023-09-15
+     * fromDate ---> fromDateFirstDate --->  toDateFirstDate ----> toDate
+     *
+     * @param fromDate
+     * @param toDate
+     * @return
+     */
+//    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);
+//        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);
+//        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();
+//
+//    }
+
     public static Date getTargetEndTime(double month, Date startDate) {
         Calendar endDate = Calendar.getInstance();
         endDate.setTime(startDate);

+ 4 - 3
service-user/src/test/java/com/java110/user/AppTest.java

@@ -56,12 +56,13 @@ public class AppTest
      */
     public void testApp()
     {
-        Date startTime = DateUtil.getDateFromStringB("2022-06-30");
-        Date endTime = DateUtil.getDateFromStringB("2024-01-01");
+        Date startTime = DateUtil.getDateFromStringA("2023-12-02 15:00:00");
+        Date endTime = DateUtil.getDateFromStringB("2024-03-01");
         double month = dayCompare(startTime,endTime);
-        System.out.println(month);
+        System.out.println(month* 309.912);
     }
 
+
     /**
      * 计算 两个时间点月份
      *