java统计大屏,按月份/天进行统计,没有数据时补0
需求来源
将数据库中的数据,按照月份或者按照天进行统计
如何插入一段漂亮的代码片
天-工具类
import org.joda.time.Days;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 报表填充
*
* @author zhh
* @date 2021/09/15 14:23:02
*/
public class ReportFillingUtil {
private static transient int gregorianCutoverYear = 1582;
/** 闰年中每月天数 */
private static final int[] DAYS_P_MONTH_LY = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
/** 非闰年中每月天数 */
private static final int[] DAYS_P_MONTH_CY = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
/** 代表数组里的年、月、日 */
private static final int Y = 0, M = 1, D = 2;
/**
* 将代表日期的字符串分割为代表年月日的整形数组
*
* @param date
* @return
*/
public static int[] splitYMD(String date) {
date = date.replace("-", "");
int[] ymd = {0, 0, 0};
ymd[Y] = Integer.parseInt(date.substring(0, 4));
ymd[M] = Integer.parseInt(date.substring(4, 6));
ymd[D] = Integer.parseInt(date.substring(6, 8));
return ymd;
}
/**
* 检查传入的参数代表的年份是否为闰年
*
* @param year
* @return
*/
public static boolean isLeapYear(int year) {
return year >= gregorianCutoverYear ?
((year % 4 == 0) && ((year % 100 != 0) || (year % 400 == 0))) : (year % 4 == 0);
}
/**
* 日期加1天
*
* @param year
* @param month
* @param day
* @return
*/
private static int[] addOneDay(int year, int month, int day) {
if (isLeapYear(year)) {
day++;
if (day > DAYS_P_MONTH_LY[month - 1]) {
month++;
if (month > 12) {
year++;
month = 1;
}
day = 1;
}
} else {
day++;
if (day > DAYS_P_MONTH_CY[month - 1]) {
month++;
if (month > 12) {
year++;
month = 1;
}
day = 1;
}
}
int[] ymd = {year, month, day};
return ymd;
}
/**
* 将不足两位的月份或日期补足为两位
*
* @param decimal
* @return
*/
public static String formatMonthDay(int decimal) {
DecimalFormat df = new DecimalFormat("00");
return df.format(decimal);
}
/**
* 将不足四位的年份补足为四位
*
* @param decimal
* @return
*/
public static String formatYear(int decimal) {
DecimalFormat df = new DecimalFormat("0000");
return df.format(decimal);
}
/**
* 计算两个日期之间相隔的天数
*
* @param begin
* @param end
* @return
* @throws ParseException
*/
public static long countDay(String begin, String end) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date beginDate, endDate;
long day = 0;
try {
beginDate = format.parse(begin);
endDate = format.parse(end);
day = (endDate.getTime() - beginDate.getTime()) / (24 * 60 * 60 * 1000);
} catch (ParseException e) {
e.printStackTrace();
}
return day;
}
/**
* 以循环的方式计算日期
*
* @param beginDate endDate
* @param endDate 结束日期
* @return {@link List<String> }
* @author zhh
* @date 2021/09/15 14:31:02
*/
public static List<String> getEveryday(String beginDate, String endDate) {
long days = countDay(beginDate, endDate);
int[] ymd = splitYMD(beginDate);
List<String> everyDays = new ArrayList<String>();
everyDays.add(beginDate);
for (int i = 0; i < days; i++) {
ymd = addOneDay(ymd[Y], ymd[M], ymd[D]);
everyDays.add(formatYear(ymd[Y]) + "-" + formatMonthDay(ymd[M]) + "-" + formatMonthDay(ymd[D]));
}
return everyDays;
}
public static void main(String[] args) {
List<String> list = ReportFillingUtil.getEveryday("2021-09-01", "2021-09-20");
for (String result : list) {
System.out.println(result);
}
}
}
月-工具类
.
import jodd.util.StringUtil;
import org.apache.commons.collections.map.HashedMap;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
public class DateUtil {
/**
* 获得近一年的开始时间和结束时间
* @return
*/
public static Map<String,String> getYearTRange(){
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Map condition=new HashedMap();
Calendar calendar = Calendar.getInstance();
calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
calendar.set(Calendar.HOUR_OF_DAY,24);
condition.put("endDate", df.format(calendar.getTime()));
calendar.set(Calendar.HOUR_OF_DAY,-8640);
condition.put("startDate", df.format(calendar.getTime()));
return condition;
}
/**
* 获得两个日期之间间隔的月份 包括传入的两个月
* [date]
*
* @param firstDateStr
* @param endDateStr
* @return
* @author
*/
public static List<String> getMonthTwo(String firstDateStr, String endDateStr) throws Exception {
if (StringUtil.isEmpty(firstDateStr) || StringUtil.isEmpty(endDateStr)) {
Map<String, String> map = getYearTRange();
firstDateStr = map.get("startDate");
endDateStr = map.get("endDate");
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date firstDate = simpleDateFormat.parse(firstDateStr);
Date endDate = simpleDateFormat.parse(endDateStr);
SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM");
Integer firstYear = getNowYear(firstDate);
Integer endYear = getNowYear(endDate);
ArrayList<String> list = new ArrayList<>();
Integer firstMonth = getNowMonth(firstDate);
Integer endMonth = getNowMonth(endDate);
//年份间隔
Integer yearSub = endYear - firstYear;
if (firstYear.equals(endYear)) { //同年
for (int i = firstMonth; i <= endMonth; i++) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, firstYear);
cal.set(Calendar.MONTH, i);
cal.set(Calendar.DATE, 1);
String adate = sm.format(toDate(getLastDayOfMonth(cal.getTime())));
list.add(adate);
}
} else if (yearSub == 1) {//差距一年
for (int i = firstMonth; i <= 11; i++) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, firstYear);
cal.set(Calendar.MONTH, i);
cal.set(Calendar.DATE, 1);
String adate = sm.format(toDate(getLastDayOfMonth(cal.getTime())));
list.add(adate);
}
for (int i = 0; i <= endMonth; i++) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, endYear);
cal.set(Calendar.MONTH, i);
cal.set(Calendar.DATE, 1);
String adate = sm.format(toDate(getLastDayOfMonth(cal.getTime())));
list.add(adate);
}
} else if (yearSub > 1) {//差距一年以上
for (int i = firstYear; i <= endYear; i++) {
if (firstYear == i) {
for (int j = firstMonth; j <= 11; j++) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, i);
cal.set(Calendar.MONTH, j);
cal.set(Calendar.DATE, 1);
String adate = sm.format(toDate(getLastDayOfMonth(cal.getTime())));
list.add(adate);
}
} else if (endYear == i) {
for (int j = 0; j <= endMonth; j++) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, i);
cal.set(Calendar.MONTH, j);
cal.set(Calendar.DATE, 1);
String adate = sm.format(toDate(getLastDayOfMonth(cal.getTime())));
list.add(adate);
}
} else {
for (int j = 0; j <= 11; j++) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, i);
cal.set(Calendar.MONTH, j);
cal.set(Calendar.DATE, 1);
String adate = sm.format(toDate(getLastDayOfMonth(cal.getTime())));
list.add(adate);
}
}
}
}
return list;
}
/**
* 根据日期获取年份
*
* @return
*/
public static Integer getNowYear(Date date) {
GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
gc.setTime(date);
return Integer.valueOf(gc.get(1));
}
/**
* 根据日期获取月份
*
* @return
*/
public static Integer getNowMonth(Date date) {
GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
gc.setTime(date);
return Integer.valueOf(gc.get(2));
}
/**
* 文本转换成日期格式,默认支持"yyyy-MM-dd"或"yyyy-MM-dd HH:mm:ss"
*
* @param str
* @return
* @throws Exception
*/
public static Date toDate(String str) {
try {
String pattern = "yyyy-MM-dd HH:mm:ss";
if (str.length() == 10) {
pattern = "yyyy-MM-dd";
} else if (str.length() == 7) {
pattern = "yyyy-MM";
} else if (str.length() == 4) {
pattern = "yyyy";
} else if (str.contains("T")) {
pattern = "yyyy-MM-dd'T'HH:mm:ss";
}
DateFormat dateFormat = new SimpleDateFormat(pattern);
return dateFormat.parse(str);
} catch (Exception e) {
return null;
}
}
/**
* 获取日期所在月的最后一天
*
* @param date
* @return
*/
public static String getLastDayOfMonth(Date date) throws Exception {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int last = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
cal.set(Calendar.DAY_OF_MONTH, last);
return toShortStringFormat(cal.getTime());
}
/**
* 日期格式转换成格式字符串(yyyy-MM-dd)
*
* @param date
* @return
* @throws Exception
*/
public static String toShortStringFormat(Date date) throws Exception {
return toStringFormat(date, "yyyy-MM-dd");
}
/**
* 日期格式转换成指定格式字符串
*
* @param date
* @param pattern
* @return
*/
public static String toStringFormat(Date date, String pattern) throws Exception {
try {
DateFormat dateFormat = new SimpleDateFormat(pattern);
return dateFormat.format(date);
} catch (Exception e) {
throw new Exception("日期转换成文本格式失败!");
}
}
}
使用方法
.
try {
List<String> months = DateUtil.getMonthTwo(personNoReqDTO.getStartDate(), personNoReqDTO.getEndDate());
List<GrowthRespDTO> arrayList = new ArrayList<>(months.size());
for (String month : months) {
List<GrowthRespDTO> statisticsManagePlanVos = null;
if (list.size() > 0 && list.get(0).getMonth() != null) {
statisticsManagePlanVos = list.stream().collect(Collectors.groupingBy(GrowthRespDTO::getMonth)).get(month);
}
// 有当月的数据
GrowthRespDTO statisticsVo;
if (!BeanUtil.isEmpty(statisticsManagePlanVos)) {
statisticsVo = statisticsManagePlanVos.get(0);
} else {
// 无当月数据时创建空对象
statisticsVo = new GrowthRespDTO();
statisticsVo.setMonth(month);
statisticsVo.setCount("0");
}
arrayList.add(statisticsVo);
}
arrayList.sort(Comparator.comparing(GrowthRespDTO::getMonth));
return arrayList;
} catch (Exception e) {
e.printStackTrace();
}