相信各位和前端对接口时,总会碰到这样的情况,返回值 数据库查出来为空,然而前端又需要你把中间断掉的数据补零
我们产生数据,不可能每月都有产生。
就搞了一个工具类,
public static List<Map<String, Object>> toDataHour(Long time, Integer type,List<Map<String, Object>> listData) {
//开始时间
//新数据
List<Map<String, Object>> newData = new ArrayList<Map<String, Object>>();
//int startYear = calStartDataUtil.get(Calendar.YEAR);
String company = "";
int size = 0;
if(type == 0) {
//一年多少月
size = 12;
company = "月";
}else if(type == 1) {
Calendar calStartDataUtil = Calendar.getInstance();
calStartDataUtil.setTimeInMillis(time);
calStartDataUtil.add(Calendar.MONTH, 1);
calStartDataUtil.set(Calendar.DAY_OF_MONTH, 0);
//一月多少天
size = calStartDataUtil.get(Calendar.DATE);
company = "日";
}else {
//一天多少小时
size = 24;
}
for (int i = 1; i <= size; i++) {
Map<String, Object> map = new HashMap<String, Object>();
//数据
map.put("value", 0);
if(!CollectionUtils.isEmpty(listData )){
for (Map<String, Object> data : listData) {
//获取时间
Integer times = (Integer) data.get("name");
if(times != null && times.intValue() == i) {
map.put("value",data.get("value"));
break;
}
}
}
map.put("name", i+company);
newData.add(map);
}
return newData;
}
入参:listData 数据库查询参数
time:时间戳 年月日范围内的都行
tpye:0 年 1月 2天
数据库查询参数 比如 你查某一年数据 name的值 就为 月份
查某一月的数据 name的值 就为月内的天
查某天的数据 name的值就为小时 可自行修改;
当然上述存在一定局限性,只能查询一年内的数据,无法选择时间段内的数据;
根据上述版本改良了一个 近一年的数据补零工具
public List<Map<String, Object>> toDataNearlyYear(List<Map<String, Object>> listData,Long time){
//Date date = new Date();//获取当前时间
List<Map<String, Object>> newData = new ArrayList<Map<String, Object>>();
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(time);
int sunYear = calendar.get(Calendar.YEAR);//获取当前年份
int sunMonth = calendar.get(Calendar.MONTH) + 1;//获取当前月份
int sunDay = calendar.get(Calendar.DATE)+1;//获取当日
calendar.add(Calendar.YEAR, -1);//当前时间减去一年,即一年前的时间
calendar.add(Calendar.MONTH, +1);
calendar.add(Calendar.DATE, +1);
int monYear = calendar.get(Calendar.YEAR);//获取过去年份
int monMonth = calendar.get(Calendar.MONTH) + 1;//获取过去月份
int monDay = calendar.get(Calendar.DATE);//获取当日
//如果当前年不等于近一年的开始时间 年不相等
//说明出现跨年现象
if(sunYear != monYear) {
//把去年的开始月份当初起始时间
//结束月写死为12月进行第一次循环
for (int i = monMonth; i <= 12 ; i++) {
Map<String, Object> map = new HashMap<String, Object>();
//添加默认值
map.put("value", 0);
//格式化时间 2019-1 月份不补零 从去年开始
//可自行判断小于10补零
String str = monYear + "-" + i;
putValue(listData, map, str);
map.put("name", str);
newData.add(map);
}
//把今年的结束月当成 结束条件
//从一月开始
for (int i = 1; i <= sunMonth ; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("value", 0);
//今年开始
String str = sunYear + "-" + i;
putValue(listData, map, str);
map.put("name", str);
newData.add(map);
}
}else {
//年相等那么没有出现跨年的现象 直接返回1-12就好
for (int i = 1; i <= 12 ; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("value", 0);
String str = monYear + "-" + i;
putValue(listData, map, str);
map.put("name", str);
newData.add(map);
}
}
return newData;
}
private void putValue(List<Map<String, Object>> listData, Map<String, Object> map, String str) {
if(CollectionUtils.isEmpty(listData )){
return;
}
for (Map<String, Object> map2 : listData) {
if(str.equals((String)map2.get("name"))){
map.put("value", map2.get("value"));
break;
}
}
}
import org.springframework.util.CollectionUtils;
关于近一月的就没做了
获取一周的数据
private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
private static final String[] WEK = {"","一","二","三","四","五","六","日"};
/**
* 获取当前周的数据
*/
public static List<Map<String, Object>> toDataWek(Long time,List<Map<String, Object>> listData) {
//开始时间
Calendar calStartDataUtil = Calendar.getInstance();
calStartDataUtil.setTimeInMillis(time);
calStartDataUtil.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
//开始时间
Long fristDay = calStartDataUtil.getTimeInMillis();
//calStartDataUtil.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
//结束时间
//Long endDay = calStartDataUtil.getTimeInMillis();
//新数据
List<Map<String, Object>> newData = new ArrayList<Map<String, Object>>();
//int startYear = calStartDataUtil.get(Calendar.YEAR);
String company = "周";
int size = 0;
for (int i = 1; i <= 7; i++) {
//格式化时间
String format = sdf.format(new Date(fristDay));
Map<String, Object> map = new HashMap<String, Object>();
//数据
map.put("value", 0);
for (Map<String, Object> data : listData) {
//获取时间
String times = (String) data.get("name");
if(times != null && format.equals(times)) {
map.put("value",data.get("value"));
break;
}
}
map.put("name", company+WEK[i]);
newData.add(map);
//加一天循环7次 从周一到周末
fristDay = fristDay + 86400000L;
}
return newData;
}