| | |
| | | |
| | | public static Date getNextMonthFirstDate(String curDate) { |
| | | Date date = DateUtil.getDateFromStringB(curDate); |
| | | return getNextMonthFirstDate(date); |
| | | } |
| | | |
| | | public static Date getNextMonthFirstDate(Date curDate) { |
| | | |
| | | return getNextMonthFirstDate(curDate,1); |
| | | } |
| | | |
| | | public static Date getNextMonthFirstDate(Date curDate,int monthCount) { |
| | | |
| | | Calendar curDateCal = Calendar.getInstance(); |
| | | curDateCal.setTime(date); |
| | | Calendar calendar = Calendar.getInstance(); |
| | | calendar.set(Calendar.DAY_OF_MONTH, 1); |
| | | calendar.set(Calendar.HOUR_OF_DAY, 0); |
| | | calendar.set(Calendar.MINUTE, 0); |
| | | calendar.set(Calendar.SECOND, 0); |
| | | calendar.add(Calendar.MONTH, 1); |
| | | return calendar.getTime(); |
| | | curDateCal.setTime(curDate); |
| | | curDateCal.set(Calendar.DAY_OF_MONTH, 1); |
| | | curDateCal.set(Calendar.HOUR_OF_DAY, 0); |
| | | curDateCal.set(Calendar.MINUTE, 0); |
| | | curDateCal.set(Calendar.SECOND, 0); |
| | | curDateCal.add(Calendar.MONTH, monthCount); |
| | | return curDateCal.getTime(); |
| | | } |
| | | |
| | | public static Date getFirstDate() { |
| | |
| | | return calendar.getTime(); |
| | | } |
| | | |
| | | public static boolean sameMonthDay(Date startDate,Date endDate){ |
| | | public static boolean sameMonthDay(Date startDate, Date endDate) { |
| | | Calendar startCalendar = Calendar.getInstance(); |
| | | 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)) { |
| | | return true; |
| | | } |
| | | |
| | | return false; |
| | | } |
| | | |
| | | public static double dayCompare(Date fromDate, Date toDate) { |
| | | double resMonth = 0.0; |
| | | Calendar from = Calendar.getInstance(); |
| | | from.setTime(fromDate); |
| | | Calendar to = Calendar.getInstance(); |
| | | 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; |
| | | |
| | | //开始时间 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); |
| | | } |
| | | |
| | | // 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 = 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; |
| | | } |
| | | |
| | | /** |
| | |
| | | * @param toDate |
| | | * @return |
| | | */ |
| | | public static double dayCompare(Date fromDate, Date toDate) { |
| | | // 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); |
| | | |
| | | //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(); |
| | | Double intMonth = Math.floor(month); |
| | | endDate.add(Calendar.MONTH, intMonth.intValue()); |
| | | double doubleMonth = month - intMonth; |
| | | if (doubleMonth <= 0) { |
| | | return endDate.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(); |
| | | |
| | | int futureDay = endDate.getActualMaximum(Calendar.DAY_OF_MONTH); |
| | | Double hour = doubleMonth * futureDay * 24; |
| | | endDate.add(Calendar.HOUR_OF_DAY, hour.intValue()); |
| | | return endDate.getTime(); |
| | | } |
| | | } |