统计两个日期之间的数据(平均数,总数。。。),无数据也要显示日期数据默认显示为0。

JAVA开发时有这么一个需求:给一个开始时间和一个结束时间,显示这段时间内每一天的数据,这个SQL语句并不大难(用一个GROUP BY就可以搞得定),关键点在于前台页面要显示折线图,所以没有数据时日期也是要显示的。在网上查了很多资料后,现总结如下,方便自己,也给大家提供一个思路。 因为我是从C转行做JAVA的(坑爹的公司!),刚学JAVA,请大佬轻喷。。。

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class DataCompletion {

    //结果集合
    private static ArrayList<DataValue> dateResult = new ArrayList<>();

    public static void main(String args[]){

        //缺少11、13、14、15、19(从2018-06-11到2018-06-20, 完全显示时应该是 11,12, 13, 14, 15, 16, 17, 18, 19)
        DataValue d = new DataValue();
        d.setTime("2018-06-12");
        d.setValue(1.0);

        DataValue d2 = new DataValue();
        d2.setTime("2018-06-18");
        d2.setValue(1.0);

        DataValue d3 = new DataValue();
        d3.setTime("2018-06-16");
        d3.setValue(1.0);


        List<DataValue> a = new ArrayList<>();
        a.add(d);
        a.add(d2);
        a.add(d3);

        List<DataValue> c = new ArrayList<>();

        Map<String, String> b = new HashMap<>();
        b.put("type", "day");
        b.put("startTime", "2018-06-11");
        b.put("endTime", "2018-06-20");

        c =  getDataCompletion(a, b);
    }

    public static List<DataValue> getDataCompletion (List<DataValue> beforList, Map<String, String> paraMap) {

        Date dateBegin, dateEnd;
        int days= 0;
        Calendar calendar10 = Calendar.getInstance();
        Calendar calendar5 = Calendar.getInstance();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
             dateBegin = sdf.parse(paraMap.get("startTime"));
             dateEnd = sdf.parse(paraMap.get("endTime"));
             /*
              * 计算开始时间和结束时间之间有几天
              * 如果想显示 01, 02, 03 三天的数据 结束日期需要传04, 因为01日 00:00 -- 04日 00:00 并不包括04
              */
             days = (int) ((dateEnd.getTime() - dateBegin.getTime()) / (1000*3600*24));
             calendar10.setTime(dateBegin);

        } catch (java.text.ParseException e) {
            e.printStackTrace();
        }

        //循环处理日期数据,把缺失的日期补全。days是时间段内的天数, beforList.size()是要处理的日期集合的天数
        for (int curr = 0; curr < days; curr++) {

            boolean dbDataExist = false;
            int index = 0;

            for(int i  = 0 ; i < beforList.size() ; i++){

                try {
                    DataValue testaa = beforList.get(i);

                    Date date2 = sdf.parse(testaa.getTime());
                    calendar5.setTime(date2);
                } catch (ParseException e) {
                    e.printStackTrace();
                }

                if(calendar10.compareTo(calendar5) == 0){
                    dbDataExist  = true;
                    index = i;
                    break;
                }
            }
            if(dbDataExist){
                DataValue testbb = beforList.get(index);

                dateResult.add(testbb);
            }else{
                DataValue testbb = new DataValue();
                testbb.setTime(sdf.format(calendar10.getTime()));
                testbb.setValue(0.0);

                dateResult.add(testbb);
            }
            //修改外层循环变量, 是calendar10 +1天, 一天后的日期
            calendar10.add(Calendar.DAY_OF_MONTH, 1 );
        }

        //打印结果

        for(DataValue str : dateResult){
            System.out.println(str);
        }
        return dateResult;
    }

}

class DataValue {

    private String time;

    private Double value;

    public String getTime() {
        return time;
    }

    public void setTime(String time) {
        this.time = time;
    }

    public Double getValue() {
        return value;
    }

    public void setValue(Double value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "DataValue{" +
                "time='" + time + '\'' +
                ", value=" + value +
                '}';
    }
}

这个是个单例,直接拷贝下来保存为:DataCompletion.java 直接运行就可以看到结果



时间较紧,请大佬们不要在意变量的命名。。。。 另外我在传参的时候多传了一个type,这个小例子没有用到,本意是想实现天类型或者月类型的,上面的只实现了天类型的,感兴趣的同学可以自己实现下月类型的(就是传2018-06-11 --- 2018-10-01, 返回 06, 07, 08, 09 月类型的数据。)

参考博文:

http://www.xuebuyuan.com/679587.html

https://www.cnblogs.com/zhongzheng123/p/5230707.html

https://bbs.csdn.net/topics/390673766

https://www.zybang.com/question/45b8d739d4d860181eb371f438a6335b.html



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值