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.youkuaiyun.com/topics/390673766
https://www.zybang.com/question/45b8d739d4d860181eb371f438a6335b.html