wuxw 2 年 前
コミット
2291fba3ed
共有2 個のファイルを変更した132 個の追加113 個の削除を含む
  1. 65 110
      java110-utils/src/main/java/com/java110/utils/util/DateUtil.java
  2. 67 3
      service-user/src/test/java/com/java110/user/AppTest.java

+ 65 - 110
java110-utils/src/main/java/com/java110/utils/util/DateUtil.java

@@ -822,137 +822,92 @@ public class DateUtil {
         startCalendar.setTime(startDate);
         Calendar endCalender = Calendar.getInstance();
         endCalender.setTime(endDate);
-        if (startCalendar.get(Calendar.DAY_OF_MONTH) == endCalender.get(Calendar.DAY_OF_MONTH)) {
+        if (
+                startCalendar.get(Calendar.DAY_OF_MONTH) == endCalender.get(Calendar.DAY_OF_MONTH)
+                && startCalendar.get(Calendar.HOUR_OF_DAY) == endCalender.get(Calendar.HOUR_OF_DAY)
+        ) {
             return true;
         }
 
         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) {
-        double resMonth = 0.0;
+
+
+        //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(fromDate);
+        from.setTime(fromDateFirstDate);
         Calendar to = Calendar.getInstance();
-        to.setTime(toDate);
+        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;
 
-        //开始时间  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 3.1  如果 fromDate 和toDate 是同一天 则直接返回整月,不再计算 4.0 和5.0
+        if (DateUtil.sameMonthDay(fromDate, toDate)) {
+            return firstDay ? result : result + 1;
         }
 
-        // 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);
+        // todo 4.0 计算 fromDate ---> fromDateFirstDate 的月份
+        double days = (fromDateFirstDate.getTime() - fromDate.getTime()) * 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);
+        BigDecimal monthDay = new BigDecimal(DateUtil.getMonthDay(fromDate));
+        BigDecimal resMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result));
 
-        //下月天数
-        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;
-    }
+        // 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);
 
-    /**
-     * 计算 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();
-//
-//    }
+        return resMonth.doubleValue();
+
+    }
 
     public static Date getTargetEndTime(double month, Date startDate) {
         Calendar endDate = Calendar.getInstance();

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

@@ -56,13 +56,77 @@ public class AppTest
      */
     public void testApp()
     {
-        Date startTime = DateUtil.getDateFromStringA("2023-12-02 15:00:00");
+        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* 309.912);
+        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();
+
+    }
     /**
      * 计算 两个时间点月份
      *
@@ -70,7 +134,7 @@ public class AppTest
      * @param toDate   结束时间
      * @return
      */
-    public double dayCompare(Date fromDate, Date toDate) {
+    public double dayCompare1(Date fromDate, Date toDate) {
         double resMonth = 0.0;
         Calendar from = Calendar.getInstance();
         from.setTime(fromDate);