Skip to content

Commit 2291fba

Browse files
committed
优化代码
1 parent 9b39254 commit 2291fba

2 files changed

Lines changed: 132 additions & 113 deletions

File tree

java110-utils/src/main/java/com/java110/utils/util/DateUtil.java

Lines changed: 65 additions & 110 deletions
Original file line numberDiff line numberDiff line change
@@ -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();

service-user/src/test/java/com/java110/user/AppTest.java

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,21 +56,85 @@ public void testSplit(){
5656
*/
5757
public void testApp()
5858
{
59-
Date startTime = DateUtil.getDateFromStringA("2023-12-02 15:00:00");
59+
Date startTime = DateUtil.getDateFromStringA("2023-12-02 22:00:00");
6060
Date endTime = DateUtil.getDateFromStringB("2024-03-01");
6161
double month = dayCompare(startTime,endTime);
62-
System.out.println(month* 309.912);
62+
System.out.println(month * 129.13 * 2.4);
6363
}
6464

65+
public static double dayCompare(Date fromDate, Date toDate) {
6566

67+
68+
//todo 需要计算三端时间 相加即可
69+
Date fromDateFirstDate = fromDate; // 第一个1日
70+
71+
Date toDateFirstDate = toDate; // 最后一个1日
72+
73+
boolean firstDay = true;
74+
75+
//todo 1.0 计算 fromDateFirstDate
76+
Calendar fromDateCal = Calendar.getInstance();
77+
fromDateCal.setTime(fromDate);
78+
fromDateCal.set(Calendar.DAY_OF_MONTH, 1);
79+
fromDateCal.set(Calendar.HOUR_OF_DAY,0);
80+
fromDateCal.set(Calendar.MINUTE,0);
81+
if (fromDate.getTime() > fromDateCal.getTime().getTime()) {
82+
fromDateCal.add(Calendar.MONTH, 1);
83+
firstDay = false;
84+
fromDateFirstDate = fromDateCal.getTime();
85+
}
86+
87+
//todo 2.0 计算 toDateFirstDate
88+
Calendar toDateCal = Calendar.getInstance();
89+
toDateCal.setTime(toDate);
90+
toDateCal.set(Calendar.DAY_OF_MONTH, 1);
91+
toDateCal.set(Calendar.HOUR_OF_DAY,0);
92+
toDateCal.set(Calendar.MINUTE,0);
93+
94+
if (toDate.getTime() > toDateCal.getTime().getTime()) {
95+
toDateFirstDate = toDateCal.getTime();
96+
}
97+
98+
// todo 3.0 计算整数月 fromDateFirstDate ---> toDateFirstDate
99+
Calendar from = Calendar.getInstance();
100+
from.setTime(fromDateFirstDate);
101+
Calendar to = Calendar.getInstance();
102+
to.setTime(toDateFirstDate);
103+
//比较月份差 可能有整数 也会负数
104+
int result = to.get(Calendar.MONTH) - from.get(Calendar.MONTH);
105+
//比较年差
106+
int month = (to.get(Calendar.YEAR) - from.get(Calendar.YEAR)) * 12;
107+
//真实 相差月份
108+
result = result + month;
109+
110+
//todo 3.1 如果 fromDate 和toDate 是同一天 则直接返回整月,不再计算 4.0 和5.0
111+
if (DateUtil.sameMonthDay(fromDate, toDate)) {
112+
return firstDay ? result : result + 1;
113+
}
114+
115+
// todo 4.0 计算 fromDate ---> fromDateFirstDate 的月份
116+
double days = (fromDateFirstDate.getTime() - fromDate.getTime()) * 1.00 / (24 * 60 * 60 * 1000);
117+
BigDecimal tmpDays = new BigDecimal(days); //相差天数
118+
BigDecimal monthDay = new BigDecimal(DateUtil.getMonthDay(fromDate));
119+
BigDecimal resMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(new BigDecimal(result));
120+
121+
// todo 5.0 计算 toDateFirstDate ----> toDate 月份
122+
days = (toDate.getTime() - toDateFirstDate.getTime()) * 1.00 / (24 * 60 * 60 * 1000);
123+
tmpDays = new BigDecimal(days); //相差天数
124+
monthDay = new BigDecimal(DateUtil.getMonthDay(toDate));
125+
resMonth = tmpDays.divide(monthDay, 4, BigDecimal.ROUND_HALF_UP).add(resMonth);
126+
127+
return resMonth.doubleValue();
128+
129+
}
66130
/**
67131
* 计算 两个时间点月份
68132
*
69133
* @param fromDate 开始时间
70134
* @param toDate 结束时间
71135
* @return
72136
*/
73-
public double dayCompare(Date fromDate, Date toDate) {
137+
public double dayCompare1(Date fromDate, Date toDate) {
74138
double resMonth = 0.0;
75139
Calendar from = Calendar.getInstance();
76140
from.setTime(fromDate);

0 commit comments

Comments
 (0)