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