一. 需求描述
需求:获取近七日柱状图统计数据。
一般实现:从数据库通过分组等方式查出每天的数据,但是如果某天没产生数据记录,那么柱状图就缺失了当天的数据显示;实际如果当天没数据柱状图应该显示0才对。
二. 实现步骤
假如:今天是2024-02-06号(需求是同样是获取近七日柱状图统计数据)
- 数据库返回的数据为:
{ "date":["2024-02-03", "2024-02-05"}, "value":[22, 55] ]
- 我们期望的数据格式为:
{ "date": ["2024-01-31", "2024-02-01", "2024-02-02", "2024-02-03", "2024-02-04", "2024-02-05", "2024-02-06"], "value": [0, 0, 0, 22, 0, 55, 0] }
- 如何将数据库返回的数据转换为我们期望的数据格式:
调用以下方法即可:fillDateUtil(7, values, dates);
三. 通过java代码实现日期补全
/**
* 填充缺失的日期数据
* @author qizhentao
* @date 2024/2/6 17:35
* @param dayNumber 获取今日往前推${dayNumber}天的所有日期集合。 例如当前日期为2024-01-07那么dayNumber=7将得到:[2024-01-01, 2024-01-02, 2024-01-03, 2024-01-04, 2024-01-05, 2024-01-06, 2024-01-07]
* @param yDataList 原始Y轴数据集合。例如:[30, 55]
* @param xDateList 原始X轴日期集合。例如:[2024-02-03, 2024-02-05]
* @deprecated 如上案例,最终会按照dayNumber给定的日期顺序重组原始数据。
*/
private static void fillDateUtil(int dayNumber, List yDataList, List xDateList) {
// 获取近${dayNumber}日所有的日期,也是柱状图X轴要显示的日期。
List<String> days = days(dayNumber);
// 1.无数据,补充全部日期下的数据。
if (xDateList.size() == 0){
for (int i = 0; i < days.size(); i++) {
xDateList.add(i, days.get(i));
yDataList.add(i, "0");
}
return;
}
// 2.补充前位缺失
for (int i = 0; i < xDateList.size(); i++) {
if (!xDateList.get(i).equals(days.get(i))){
xDateList.add(i, days.get(i));
yDataList.add(i, "0");
}
}
// 3.补充后位缺失
if (xDateList.size() < days.size()){
for (int i = xDateList.size(); i < days.size(); i++) {
xDateList.add(i, days.get(i));
yDataList.add(i, "0");
}
}
}
/**
* 获取指定天数每日的日期(也是柱状图X轴要显示的日期。)<br>
* 假如今日是2024-02-06号<br>
* 当参数day=7时,则返回:[2024-01-31, 2024-02-01, 2024-02-02, 2024-02-03, 2024-02-04, 2024-02-05, 2024-02-06]
*/
private static List<String> days(int day){
Date date = new Date();
List<String> list = new ArrayList<>();
for (int i = day - 1; i >= 0 ; i--) {
list.add(DateUtil.offsetDay(date, -i).toDateStr());
}
return list;
}
四. main方法测试看看结果
public static void main(String[] args) {
// 1.需求:获取近七日柱状图数据
int dayNumber = 7;
// 2.例如:从数据库只查出来2天的数据
List<String> xDateList = new ArrayList();
xDateList.add("2024-02-03");
xDateList.add("2024-02-05");
List<String> yDataList = new ArrayList();
yDataList.add("22");
yDataList.add("55");
// 3.空位数据补充
fillDateUtil(dayNumber, yDataList, xDateList);
System.out.println(yDataList.toString());
System.out.println(xDateList.toString());
/*
当前日期为2024-02-06
输出打印:
[0, 0, 0, 22, 0, 55, 0]
[2024-01-31, 2024-02-01, 2024-02-02, 2024-02-03, 2024-02-04, 2024-02-05, 2024-02-06]
*/
}
补充
获取指定天数每日的日期方法中的 DateUtil.offsetDay() 日期偏移方法用的hutool工具类,也可自己实现此方法,或引入hutool依赖。