Java將日期拆分成按周或月時間段統計


  項目上需要按照天、周、月,三個不同的維度來做統計,天的話很好說,都是單獨的,周和月的話,就需要把一個時間段拆分成多個時間區間了。
  這里的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));
  }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM