java统计大屏,按月份/天进行统计,没有数据时补0

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();
        }
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java数据动态展示是指使用Java编程语言和相关技术,通过设计和开发大幕展示系统,将数据以动态的方式展示出来。 首先,Java作为一种广泛应用的编程语言,具备强大的数据处理和可视化能力,可以处理各种数据类型和数据来源。它提供了各种类库和框架,例如JavaFX、Swing等,用于创建具有良好用户体验的图形用户界面(GUI)。 大数据动态展示可以在各种应用场景中使用,如企业大数据监控、金融市场实时行情展示、交通信息监控等。通过Java编写的程序,可以实时监测和获取各种数据源的信息,并将其可视化展示在大幕上。 Java数据动态展示通常需要以下步骤: 1. 数据获取:通过编写Java程序,连接数据库、API接口或其他数据源,实时获取需要展示的数据。例如,可以通过JDBC连接数据库,或通过HTTP请求获取API接口返回的数据。 2. 数据处理:对获取到的数据进行处理和计算,以满足展示需求。例如,可以对数据进行过滤、排序、聚合等操作,以便更好地展示。 3. 数据可视化:使用Java的图形类库和框架,将数据以直观且易于理解的方式展示在大幕上。可以使用图表、图形、地图等方式,根据数据内容选择合适的可视化方式。 4. 展示更新:实时更新并展示最新的数据。通过Java编写的程序可以周期性地获取数据,并及时更新在大幕上的展示内容。 5. 用户交互:通过Java编写的程序,可以实现用户与大幕之间的交互。例如,可以提供用户操作按钮、滚动条等,以便用户对展示内容进行选择、筛选、导航等操作。 综上所述,Java数据动态展示是一种通过Java编程语言和相关技术,将数据以动态的方式展示在大幕上的方法。它可以满足各种应用场景的需求,并提供实时、直观和易于理解的数据展示效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值