项目上需要按照天、周、月,三个不同的维度来做统计,天的话很好说,都是单独的,周和月的话,就需要把一个时间段拆分成多个时间区间了。
这里的statisticsType参数,用来判断是根据周来拆分,还是根据月来拆分。map中存放的是需要拆分的时间开始日期和结束日期。
/** * 根据传入的参数,来对日期区间进行拆分,返回拆分后的日期List * @param statisticsType * @param map * @return * @throws ParseException * @author lihq 2019-6-24 * @editor * @editcont */ public List<String> doDateByStatisticsType(String statisticsType,Map<String, Object> map) throws ParseException{ List<String> listWeekOrMonth = new ArrayList<String>(); DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); String startDate = (String)map.get("startDate"); String endDate = (String)map.get("endDate"); Date sDate = dateFormat.parse(startDate); Calendar sCalendar = Calendar.getInstance(); sCalendar.setFirstDayOfWeek(Calendar.MONDAY); sCalendar.setTime(sDate); Date eDate = dateFormat.parse(endDate); Calendar eCalendar = Calendar.getInstance(); eCalendar.setFirstDayOfWeek(Calendar.MONDAY); eCalendar.setTime(eDate); boolean bool =true; if(statisticsType.equals("week")){ while(sCalendar.getTime().getTime()<eCalendar.getTime().getTime()){ if(bool||sCalendar.get(Calendar.DAY_OF_WEEK)==2||sCalendar.get(Calendar.DAY_OF_WEEK)==1){ listWeekOrMonth.add(dateFormat.format(sCalendar.getTime())); bool = false; } sCalendar.add(Calendar.DAY_OF_MONTH, 1); } listWeekOrMonth.add(dateFormat.format(eCalendar.getTime())); if(listWeekOrMonth.size()%2!=0){ listWeekOrMonth.add(dateFormat.format(eCalendar.getTime())); } }else{ while(sCalendar.getTime().getTime()<eCalendar.getTime().getTime()){ if(bool||sCalendar.get(Calendar.DAY_OF_MONTH)==1||sCalendar.get(Calendar.DAY_OF_MONTH)==sCalendar.getActualMaximum(Calendar.DAY_OF_MONTH)){ listWeekOrMonth.add(dateFormat.format(sCalendar.getTime())); bool = false; } sCalendar.add(Calendar.DAY_OF_MONTH, 1); } listWeekOrMonth.add(dateFormat.format(eCalendar.getTime())); if(listWeekOrMonth.size()%2!=0){ listWeekOrMonth.add(dateFormat.format(eCalendar.getTime())); } } return listWeekOrMonth; }
这里以statisticsType参数值为:week,map中的时间参数为:{startDate=2019-08-30, endDate=2019-09-13} 为例,输出结果为:
listWeekOrMonth值:[2019-08-30, 2019-09-01, 2019-09-02, 2019-09-08, 2019-09-09, 2019-09-13]
这里输出的值,每两个时间为一个时间段,也就是说2019-08-30~2019-09-01为第一周,2019-09-02~2019-09-08为第二周,2019-09-09~2019-09-13为第三周。
这里以statisticsType参数值为:month,map中的时间参数为:{startDate=2019-08-30, endDate=2019-09-13} 为例,输出结果为:
listWeekOrMonth值:[2019-08-30, 2019-08-31, 2019-09-01, 2019-09-13]
这里输出的值,每两个时间为一个时间段,也就是说2019-08-30~2019-08-31为第一月,2019-09-01~2019-09-13为第二月。
这里循环查询的时候,可以以i+2来做循环:
for(int i=0;i<listWeekOrMonth.size();i+=2){ param.put("actStartDate", listWeekOrMonth.get(i)); param.put("actEndDate", listWeekOrMonth.get(i+1)); }