获得最近30天中每两天一个时间段

需求解析:

获得最近30天中的每两天一个时间段,由此得出30天中两天一个段共有15个时间段,一般用于数据统计中坐标为日的刻度

即如图:每个刻度就是一个时间段,

如:11刻度为:"2018-08-10 00:00:00":"2018-08-11 23:59:59"

  13刻度为:"2018-08-12 00:00:00":"2018-08-13 23:59:59"

  ...

  8刻度为9月:"2018-09-07 00:00:00":"2018-09-08 17:04:20"

 代码如下:

  public static String[] getDayOfTheMonth(){
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String[] dateStr = new String[15];//设置数组大小为15
        Calendar cal = Calendar.getInstance();
        int day = cal.get(Calendar.DAY_OF_MONTH);//得到当前天
        Map<String, Object> params = Maps.newHashMap();//定义Map存放起始时间key和结束时间value  
        //起始时间
        String startTime = "";
        //结束时间
        String endTime = "";
        //获取当前时间为最后一个坐标点的结束时间
        endTime = formatter.format(cal.getTime());
        
        for (int i = 15; i > 0; i--) {
            params.clear();
            int year = cal.get(Calendar.YEAR);//循环内获得当前年--因为在具体处理中会改变年、月、日故在循环内获得改变后的年、月、日
            int month = cal.get(Calendar.MONTH);//循环内获得当前月
            int today = cal.get(Calendar.DAY_OF_MONTH);//循环内获得当前天
            //如果当前天是2号--第一次进入循环
            if (day == 2) {
                cal.set(year, month, day-1, 0, 0, 0);//天数减1
                startTime = formatter.format(cal.getTime());//得到减1后的时间--即:yyyy-MM-01 00:00:00
                params.put(startTime, endTime);
                day = 0;
            } else if (day == 1) {//如果当前天是1号--第一次进入循环
                cal.add(Calendar.DATE, -1);//天数减1得到上个月的最后一天,如当前月为9月1号,那么设置后为8月31号
                cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);//设置时间
                startTime = formatter.format(cal.getTime());//得到起始时间
                params.put(startTime, endTime);
                day = 0;
            } else if (today == 1) {//非第一次进入循环
                cal.add(Calendar.DATE, -1);
                cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 23, 59, 59);
                endTime = formatter.format(cal.getTime());
                cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH)-1, 0, 0, 0);
                startTime = formatter.format(cal.getTime());
                params.put(startTime, endTime);
            } else if (today == 2) {
                cal.set(year, month, today-1, 23, 59, 59);
                endTime = formatter.format(cal.getTime());
                cal.add(Calendar.DATE, -1);
                cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
                startTime = formatter.format(cal.getTime());
                params.put(startTime, endTime);
            }else {
                if (i != 15) {//第一次进入循环且当前日期不为1号和2号,不需要设置结束时间,循环外已经设置
                    cal.set(year, month, today-1, 23, 59, 59);
                    endTime = formatter.format(cal.getTime());
                }
                cal.set(year, month, cal.get(Calendar.DAY_OF_MONTH)-1, 0, 0, 0);
                startTime = formatter.format(cal.getTime());
                params.put(startTime, endTime);
            }
            String dates = JSON.toJSONString(params);
            dateStr[i-1] = dates;
        }
        return dateStr;
    }

 调用方法:

  public static void main(String[] args) {
        String[] strs = getDayOfTheMonth();
        for (String str : strs) {
            Map<String, Object> params = JSON.parseObject(str);
            System.err.println(params);
        }
    }

结果为:

 

注:上面做法可以获得最近30天每两天的时间段,但每天坐标轴的刻度都会变化

posted @ 2018-09-08 17:54  nihao小树苗  阅读(299)  评论(0编辑  收藏  举报