|
@@ -822,137 +822,92 @@ public class DateUtil {
|
|
|
startCalendar.setTime(startDate);
|
|
startCalendar.setTime(startDate);
|
|
|
Calendar endCalender = Calendar.getInstance();
|
|
Calendar endCalender = Calendar.getInstance();
|
|
|
endCalender.setTime(endDate);
|
|
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 true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
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) {
|
|
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();
|
|
Calendar from = Calendar.getInstance();
|
|
|
- from.setTime(fromDate);
|
|
|
|
|
|
|
+ from.setTime(fromDateFirstDate);
|
|
|
Calendar to = Calendar.getInstance();
|
|
Calendar to = Calendar.getInstance();
|
|
|
- to.setTime(toDate);
|
|
|
|
|
|
|
+ to.setTime(toDateFirstDate);
|
|
|
//比较月份差 可能有整数 也会负数
|
|
//比较月份差 可能有整数 也会负数
|
|
|
int result = to.get(Calendar.MONTH) - from.get(Calendar.MONTH);
|
|
int result = to.get(Calendar.MONTH) - from.get(Calendar.MONTH);
|
|
|
//比较年差
|
|
//比较年差
|
|
|
int month = (to.get(Calendar.YEAR) - from.get(Calendar.YEAR)) * 12;
|
|
int month = (to.get(Calendar.YEAR) - from.get(Calendar.YEAR)) * 12;
|
|
|
-
|
|
|
|
|
//真实 相差月份
|
|
//真实 相差月份
|
|
|
result = result + month;
|
|
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 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) {
|
|
public static Date getTargetEndTime(double month, Date startDate) {
|
|
|
Calendar endDate = Calendar.getInstance();
|
|
Calendar endDate = Calendar.getInstance();
|