zoukankan      html  css  js  c++  java
  • 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));
      }
  • 相关阅读:
    使用内部单向链表实现的一个简单堆栈
    通过反射调用内部类的隐藏方法
    动态代理生成空对象
    通过使用java.lang.reflect.Proxy实现动态代理
    简单代理模式
    暗色CSS,适用与Stylish, IE, FF, OPERA等.
    CWnd派生的控件处理MouseMove, MouseHover, MouseLeave
    _tcscpy_s的size应至少为src的长度+1(要把计算在内)
    用INET(CHttpFile)下载有重定向链接时获取最终URL的方法.
    GetDlgItem以及其他获得CWnd相关的函数要注意。。
  • 原文地址:https://www.cnblogs.com/1012hq/p/11434129.html
Copyright © 2011-2022 走看看