@@ -822,137 +822,92 @@ public static boolean sameMonthDay(Date startDate, Date endDate) {
822822 startCalendar .setTime (startDate );
823823 Calendar endCalender = Calendar .getInstance ();
824824 endCalender .setTime (endDate );
825- if (startCalendar .get (Calendar .DAY_OF_MONTH ) == endCalender .get (Calendar .DAY_OF_MONTH )) {
825+ if (
826+ startCalendar .get (Calendar .DAY_OF_MONTH ) == endCalender .get (Calendar .DAY_OF_MONTH )
827+ && startCalendar .get (Calendar .HOUR_OF_DAY ) == endCalender .get (Calendar .HOUR_OF_DAY )
828+ ) {
826829 return true ;
827830 }
828831
829832 return false ;
830833 }
831834
835+
836+
837+ /**
838+ * 计算 fromDate 2023-01-12 toDate 2023-09-15
839+ * 2023-01-12--->2023-01-01 ---> 2023-09-01 ------> 2023-09-15
840+ * fromDate ---> fromDateFirstDate ---> toDateFirstDate ----> toDate
841+ *
842+ * @param fromDate
843+ * @param toDate
844+ * @return
845+ */
832846 public static double dayCompare (Date fromDate , Date toDate ) {
833- double resMonth = 0.0 ;
847+
848+
849+ //todo 需要计算三端时间 相加即可
850+ Date fromDateFirstDate = fromDate ; // 第一个1日
851+
852+ Date toDateFirstDate = toDate ; // 最后一个1日
853+
854+ boolean firstDay = true ;
855+
856+ //todo 1.0 计算 fromDateFirstDate
857+ Calendar fromDateCal = Calendar .getInstance ();
858+ fromDateCal .setTime (fromDate );
859+ fromDateCal .set (Calendar .DAY_OF_MONTH , 1 );
860+ fromDateCal .set (Calendar .HOUR_OF_DAY ,0 );
861+ fromDateCal .set (Calendar .MINUTE ,0 );
862+ if (fromDate .getTime () > fromDateCal .getTime ().getTime ()) {
863+ fromDateCal .add (Calendar .MONTH , 1 );
864+ firstDay = false ;
865+ fromDateFirstDate = fromDateCal .getTime ();
866+ }
867+
868+ //todo 2.0 计算 toDateFirstDate
869+ Calendar toDateCal = Calendar .getInstance ();
870+ toDateCal .setTime (toDate );
871+ toDateCal .set (Calendar .DAY_OF_MONTH , 1 );
872+ toDateCal .set (Calendar .HOUR_OF_DAY ,0 );
873+ toDateCal .set (Calendar .MINUTE ,0 );
874+
875+ if (toDate .getTime () > toDateCal .getTime ().getTime ()) {
876+ toDateFirstDate = toDateCal .getTime ();
877+ }
878+
879+ // todo 3.0 计算整数月 fromDateFirstDate ---> toDateFirstDate
834880 Calendar from = Calendar .getInstance ();
835- from .setTime (fromDate );
881+ from .setTime (fromDateFirstDate );
836882 Calendar to = Calendar .getInstance ();
837- to .setTime (toDate );
883+ to .setTime (toDateFirstDate );
838884 //比较月份差 可能有整数 也会负数
839885 int result = to .get (Calendar .MONTH ) - from .get (Calendar .MONTH );
840886 //比较年差
841887 int month = (to .get (Calendar .YEAR ) - from .get (Calendar .YEAR )) * 12 ;
842-
843888 //真实 相差月份
844889 result = result + month ;
845890
846- //开始时间 2021-06-01 2021-08-05 result = 2 2021-08-01
847- Calendar newFrom = Calendar .getInstance ();
848- newFrom .setTime (fromDate );
849- newFrom .add (Calendar .MONTH , result );
850- //如果加月份后 大于了当前时间 默认加 月份 -1 情况 12-19 21-01-10
851- //这个是神的逻辑一定好好理解
852- if (newFrom .getTime ().getTime () > toDate .getTime ()) {
853- newFrom .setTime (fromDate );
854- result = result - 1 ;
855- newFrom .add (Calendar .MONTH , result );
891+ //todo 3.1 如果 fromDate 和toDate 是同一天 则直接返回整月,不再计算 4.0 和5.0
892+ if (DateUtil .sameMonthDay (fromDate , toDate )) {
893+ return firstDay ? result : result + 1 ;
856894 }
857895
858- // t1 2021-08-01 t2 2021-08-05
859- long t1 = newFrom .getTime ().getTime ();
860- long t2 = to .getTime ().getTime ();
861- //相差毫秒
862- double days = (t2 - t1 ) * 1.00 / (24 * 60 * 60 * 1000 );
896+ // todo 4.0 计算 fromDate ---> fromDateFirstDate 的月份
897+ double days = (fromDateFirstDate .getTime () - fromDate .getTime ()) * 1.00 / (24 * 60 * 60 * 1000 );
863898 BigDecimal tmpDays = new BigDecimal (days ); //相差天数
864- BigDecimal monthDay = null ;
865- Calendar newFromMaxDay = Calendar .getInstance ();
866- newFromMaxDay .set (newFrom .get (Calendar .YEAR ), newFrom .get (Calendar .MONTH ), 1 , 0 , 0 , 0 );
867- newFromMaxDay .add (Calendar .MONTH , 1 ); //下个月1号
868- //在当前月中 这块有问题
869- if (toDate .getTime () < newFromMaxDay .getTime ().getTime ()) {
870- monthDay = new BigDecimal (newFrom .getActualMaximum (Calendar .DAY_OF_MONTH ));
871- return tmpDays .divide (monthDay , 4 , BigDecimal .ROUND_HALF_UP ).add (new BigDecimal (result )).doubleValue ();
872- }
873- // 上月天数
874- days = (newFromMaxDay .getTimeInMillis () - t1 ) * 1.00 / (24 * 60 * 60 * 1000 );
875- tmpDays = new BigDecimal (days );
876- monthDay = new BigDecimal (newFrom .getActualMaximum (Calendar .DAY_OF_MONTH ));
877- BigDecimal preRresMonth = tmpDays .divide (monthDay , 4 , BigDecimal .ROUND_HALF_UP );
899+ BigDecimal monthDay = new BigDecimal (DateUtil .getMonthDay (fromDate ));
900+ BigDecimal resMonth = tmpDays .divide (monthDay , 4 , BigDecimal .ROUND_HALF_UP ).add (new BigDecimal (result ));
878901
879- //下月天数
880- days = (t2 - newFromMaxDay .getTimeInMillis ()) * 1.00 / (24 * 60 * 60 * 1000 );
881- tmpDays = new BigDecimal (days );
882- monthDay = new BigDecimal (newFromMaxDay .getActualMaximum (Calendar .DAY_OF_MONTH ));
883- resMonth = tmpDays .divide (monthDay , 4 , BigDecimal .ROUND_HALF_UP ).add (new BigDecimal (result )).add (preRresMonth ).doubleValue ();
884- return resMonth ;
885- }
902+ // todo 5.0 计算 toDateFirstDate ----> toDate 月份
903+ days = (toDate .getTime () - toDateFirstDate .getTime ()) * 1.00 / (24 * 60 * 60 * 1000 );
904+ tmpDays = new BigDecimal (days ); //相差天数
905+ monthDay = new BigDecimal (DateUtil .getMonthDay (toDate ));
906+ resMonth = tmpDays .divide (monthDay , 4 , BigDecimal .ROUND_HALF_UP ).add (resMonth );
886907
887- /**
888- * 计算 fromDate 2023-01-12 toDate 2023-09-15
889- * 2023-01-12--->2023-01-01 ---> 2023-09-01 ------> 2023-09-15
890- * fromDate ---> fromDateFirstDate ---> toDateFirstDate ----> toDate
891- *
892- * @param fromDate
893- * @param toDate
894- * @return
895- */
896- // public static double dayCompare(Date fromDate, Date toDate) {
897- //
898- //
899- // //todo 需要计算三端时间 相加即可
900- // Date fromDateFirstDate = fromDate; // 第一个1日
901- //
902- // Date toDateFirstDate = toDate; // 最后一个1日
903- //
904- // boolean firstDay = true;
905- //
906- // //todo 1.0 计算 fromDateFirstDate
907- // Calendar fromDateCal = Calendar.getInstance();
908- // fromDateCal.setTime(fromDate);
909- // fromDateCal.set(Calendar.DAY_OF_MONTH, 1);
910- // if (fromDate.getTime() > fromDateCal.getTime().getTime()) {
911- // fromDateCal.add(Calendar.MONTH, 1);
912- // firstDay = false;
913- // fromDateFirstDate = fromDateCal.getTime();
914- // }
915- //
916- // //todo 2.0 计算 toDateFirstDate
917- // Calendar toDateCal = Calendar.getInstance();
918- // toDateCal.setTime(toDate);
919- // toDateCal.set(Calendar.DAY_OF_MONTH, 1);
920- // if (toDate.getTime() > toDateCal.getTime().getTime()) {
921- // toDateFirstDate = toDateCal.getTime();
922- // }
923- //
924- // // todo 3.0 计算整数月 fromDateFirstDate ---> toDateFirstDate
925- // Calendar from = Calendar.getInstance();
926- // from.setTime(fromDateFirstDate);
927- // Calendar to = Calendar.getInstance();
928- // to.setTime(toDateFirstDate);
929- // //比较月份差 可能有整数 也会负数
930- // int result = to.get(Calendar.MONTH) - from.get(Calendar.MONTH);
931- // //比较年差
932- // int month = (to.get(Calendar.YEAR) - from.get(Calendar.YEAR)) * 12;
933- // //真实 相差月份
934- // result = result + month;
935- //
936- // //todo 3.1 如果 fromDate 和toDate 是同一天 则直接返回整月,不再计算 4.0 和5.0
937- // if (DateUtil.sameMonthDay(fromDate, toDate)) {
938- // return firstDay ? result : result + 1;
939- // }
940- //
941- // // todo 4.0 计算 fromDate ---> fromDateFirstDate 的月份
942- // double days = (fromDateFirstDate.getTime() - fromDate.getTime()) * 1.00 / (24 * 60 * 60 * 1000);
943- // BigDecimal tmpDays = new BigDecimal(days); //相差天数
944- // BigDecimal monthDay = new BigDecimal(DateUtil.getMonthDay(fromDate));
945- // BigDecimal resMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result));
946- //
947- // // todo 5.0 计算 toDateFirstDate ----> toDate 月份
948- // days = (toDate.getTime() - toDateFirstDate.getTime()) * 1.00 / (24 * 60 * 60 * 1000);
949- // tmpDays = new BigDecimal(days); //相差天数
950- // monthDay = new BigDecimal(DateUtil.getMonthDay(toDate));
951- // resMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(resMonth);
952- //
953- // return resMonth.doubleValue();
954- //
955- // }
908+ return resMonth .doubleValue ();
909+
910+ }
956911
957912 public static Date getTargetEndTime (double month , Date startDate ) {
958913 Calendar endDate = Calendar .getInstance ();
0 commit comments