首页 > 其他分享 >报表中常用的一个时间段内按照不同周期划分时间段,同时也命名每个时间段名称

报表中常用的一个时间段内按照不同周期划分时间段,同时也命名每个时间段名称

时间:2023-11-27 10:34:25浏览次数:33  
标签:refEnd DateUtils end 报表 MM YYYY 时间段 命名 public

用Java写的,基于若依的玩意,有需要拿去用或优化一下

 

首先建立返回的实体对象和周期枚举

public class ChartLine {
    private Date beginTime;
    private Date endTime;
    private String lineName;
}
public enum SplitWay
{

    /**
     * 天
     */
    Day(0),
    /**
     * 周
     */
    Week(1),

    /**
     * 月
     */
    Month(2),

    /**
     * 年
     */
    Year(3),

    /**
     * 季度
     */
    Quarter(4),

    /**
     * 半年
     */
    HalfY(5);

    // 成员变量
    private int value;
    // 构造方法
    SplitWay(int value) {
        this.value = value;
    }
    // get set 方法
    public int getValue()
    {
        return this.value;
    }

    public SplitWay setValue(int value)
    {
        for (SplitWay way:SplitWay.values()){
            if(way.getValue()==value){
                return way;
            }
        }
        return SplitWay.Day;
    }
}

几个常用的时间格式化规则

public static String YYYY = "yyyy";
public static String YY = "yy";
public static String YYYY_MM = "yyyy-MM";
public static String CN_SHORT_YYYY_MM = "yy年M月";
public static String YYYY_MM_DD = "yyyy-MM-dd";
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

核心代码,私有的,DateUtils是当前Java Class,用过若依的都懂的,这里也只是提供一个算法。我个人其实比较喜欢if-else,想改造成switch-case也行

private static ChartLine getDateOne(Date begin, Date end, SplitWay splitWay){
        if(end.after(begin)){
            ChartLine dateRef=new ChartLine();
            dateRef.setBeginTime(begin);;
            Date beginDate= DateUtils.dateTime(DateUtils.YYYY_MM_DD,DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,begin));
            Calendar CAL = Calendar.getInstance();
            CAL.setFirstDayOfWeek(Calendar.MONDAY);
            CAL.setTime(beginDate);
            Date refEnd=begin;

            if(splitWay.equals(SplitWay.Day)){
                if(beginDate.equals(refEnd)){
                    refEnd=DateUtils.addDays(begin,1);
                }else{
                    refEnd=DateUtils.addDays(beginDate,1);
                }
                if(refEnd.after(end))refEnd=end;
                dateRef.setLineName(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD,begin));

            }else if(splitWay.equals(SplitWay.Week)){
                Integer beginWeek=CAL.get(Calendar.DAY_OF_WEEK);
                if(beginDate.equals(refEnd)&&beginWeek==CAL.getFirstDayOfWeek()){
                    refEnd=DateUtils.addDays(begin,7);
                }else{
                    if(beginWeek<CAL.getFirstDayOfWeek()) {
                        refEnd = DateUtils.addDays(beginDate, 1);
                    }else{
                        refEnd = DateUtils.addDays(beginDate, 9-beginWeek);
                    }
                }
                if(refEnd.after(end))refEnd=end;
                dateRef.setLineName(DateUtils.parseDateToStr(DateUtils.CN_SHORT_YYYY_MM,begin)+"第"+CAL.get(Calendar.WEEK_OF_MONTH)+"周");

            }else if(splitWay.equals(SplitWay.Month)){
                Integer beginMonth=CAL.get(Calendar.DATE);
                if(beginDate.equals(refEnd)&&beginMonth==1){
                    refEnd=DateUtils.addMonths(begin,1);
                }else{
                    String endStr=DateUtils.parseDateToStr(DateUtils.YYYY_MM,DateUtils.addMonths(beginDate, 1))+"-01";
                    refEnd=DateUtils.dateTime(DateUtils.YYYY_MM_DD,endStr);
                }
                if(refEnd.after(end))refEnd=end;
                dateRef.setLineName(DateUtils.parseDateToStr(DateUtils.CN_SHORT_YYYY_MM,begin));
            }else if(splitWay.equals(SplitWay.Year)){
                Integer beginMonth=CAL.get(Calendar.DATE);
                Integer beginYear=CAL.get(Calendar.MONTH)+1;
                if(beginDate.equals(refEnd)&&beginMonth==1&&beginYear==1){
                    refEnd=DateUtils.addYears(begin,1);
                }else{
                    String endStr=DateUtils.parseDateToStr(DateUtils.YYYY,DateUtils.addYears(beginDate, 1))+"-01-01";
                    refEnd=DateUtils.dateTime(DateUtils.YYYY_MM_DD,endStr);
                }

                if(refEnd.after(end))refEnd=end;
                dateRef.setLineName(DateUtils.parseDateToStr(DateUtils.YYYY,begin)+"年");

            }else if(splitWay.equals(SplitWay.Quarter)){
                Integer beginMonth=CAL.get(Calendar.DATE);
                Integer beginYear=CAL.get(Calendar.MONTH)+1;
                List<Integer> beginYears=new ArrayList<>();
                beginYears.add(1);
                beginYears.add(4);
                beginYears.add(7);
                beginYears.add(10);
                if(beginDate.equals(refEnd)&&beginMonth==1&&beginYears.contains(beginYear)){
                    refEnd=DateUtils.addMonths(begin,3);
                }else{
                    Integer addMonth=(beginYear-1)%3==0?3:(beginYear-1)%3;
                    String endStr=DateUtils.parseDateToStr(DateUtils.YYYY_MM,DateUtils.addMonths(beginDate, addMonth))+"-01";
                    refEnd=DateUtils.dateTime(DateUtils.YYYY_MM_DD,endStr);
                }
                if(refEnd.after(end))refEnd=end;
                if(beginYear<4){
                    dateRef.setLineName(DateUtils.parseDateToStr(DateUtils.YY,begin)+"年第1季度");
                }else if(beginYear<7){
                    dateRef.setLineName(DateUtils.parseDateToStr(DateUtils.YY,begin)+"年第2季度");
                }else if(beginYear<10){
                    dateRef.setLineName(DateUtils.parseDateToStr(DateUtils.YY,begin)+"年第3季度");
                }else{
                    dateRef.setLineName(DateUtils.parseDateToStr(DateUtils.YY,begin)+"年第4季度");
                }
            }else if(splitWay.equals(SplitWay.HalfY)){
                Integer beginMonth=CAL.get(Calendar.DATE);
                Integer beginYear=CAL.get(Calendar.MONTH)+1;
                List<Integer> beginYears=new ArrayList<>();
                beginYears.add(1);
                beginYears.add(7);
                if(beginDate.equals(refEnd)&&beginMonth==1&&beginYears.contains(beginYear)){
                    refEnd=DateUtils.addMonths(begin,6);
                }else{
                    Integer addMonth=(beginYear-1)%6==0?6:(beginYear-1)%6;
                    String endStr=DateUtils.parseDateToStr(DateUtils.YYYY_MM,DateUtils.addMonths(beginDate, addMonth))+"-01";
                    refEnd=DateUtils.dateTime(DateUtils.YYYY_MM_DD,endStr);
                }

                if(refEnd.after(end))refEnd=end;
                if(beginYear<7){
                    dateRef.setLineName(DateUtils.parseDateToStr(DateUtils.YY,begin)+"年上半年");
                }else{
                    dateRef.setLineName(DateUtils.parseDateToStr(DateUtils.YY,begin)+"年下半年");
                }

            }else{
                refEnd= DateUtils.addDays(begin,-1);
            }
            if(refEnd.after(begin)) {
                dateRef.setEndTime(refEnd);;
                return dateRef;
            }else{
                return null;
            }
        }else{
            return null;
        }
    }

然后是内循环方法,生成list,也是私有的

private static List<ChartLine> getDates(List<ChartLine> dates,Date begin, Date end, SplitWay splitWay){
        ChartLine one=getDateOne(begin,end,splitWay);
        if(one!=null) {
            dates.add(one);
            if(one.getEndTime().before(end)){
                dates=getDates(dates,one.getEndTime(),end,splitWay);
            }
        }
        return dates;
    }

最后是public

public static List<ChartLine> toDateList(Date begin, Date end, SplitWay splitWay)
    {
        List<ChartLine> refDate=new ArrayList<>();
        if(end.after(begin)){
            refDate=getDates(refDate,begin,end,splitWay);
        }
        return refDate;
    }

题外话,正常前端默认是不会传具体起止时间给后端,传给后端也通常是【yyyy-MM-dd】格式,后端遇到这个问题可以有很多处理方式,我个人习惯是默认给一个时间的最大值最小值,而且结束时间正常加一天。那样SQL层面一个between-and梭哈就完了....

public static String getAddOneDayDate(String dateStr){
        if(StringUtils.isNotEmpty(dateStr)) {
            try {
                Date date = DateUtils.addDays(DateUtils.dateTime(DateUtils.YYYY_MM_DD,dateStr),1);
                return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,date);
            }catch (Exception e){
                return "2099-01-01 00:00:00";
            }
        }else{
            return "2099-01-01 00:00:00";
        }
    }

    public static String getThisDayDate(String dateStr){
        if(StringUtils.isNotEmpty(dateStr)) {
            try {
                Date date = DateUtils.dateTime(DateUtils.YYYY_MM_DD,dateStr);
                return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,date);
            }catch (Exception e){
                return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,new Date(0L));
            }
        }else{
            return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS,new Date(0L));
        }
    }

 

标签:refEnd,DateUtils,end,报表,MM,YYYY,时间段,命名,public
From: https://www.cnblogs.com/MilanGo/p/17858696.html

相关文章

  • python 截取xlsx文件中某个时间段的数据
    Python截取xlsx文件中某个时间段的数据引言在日常工作和数据分析中,我们经常需要处理各种各样的数据文件。而其中一种较为常见的文件格式是Excel文件,尤其是.xlsx文件。Python作为一种强大的编程语言,提供了丰富的库和工具来处理Excel文件。本文将介绍如何使用Python截取.xlsx文件中......
  • Java报表详情介绍及示例程
    Java报表详情介绍及示例程序简介Java报表是一种用于展示数据并提供可视化分析的工具。它可以将数据转化为图表、表格、图像等形式,帮助用户更直观地理解数据的含义和趋势。Java报表通常用于企业管理、数据分析、业务决策等领域,具有易于使用、灵活性高、功能强大等特点。常用的Java报......
  • MySQL 按时间段统计SQL
    按2小时段统计select*from(SELECTFLOOR(HOUR(dateTimeColumn)/2)*2ashour,count(id)asnumFROMtableNamegroupbyhour)tmporderbynum 按1小时段统计select*from(SELECTHOUR(dateTimeColumn)ashour,count(id)asnumFROMtableNamegroupby......
  • DevExpress中文教程 - 如何在macOS和Linux (CTP)上创建、修改报表(下)
    DevExpressReporting是.NETFramework下功能完善的报表平台,它附带了易于使用的VisualStudio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表。DevExpressReports—跨平台报表组件,允许用户在针对任何基于.NET平台的应用程序中生成......
  • 界面组件DevExpress Reporting v23.1 - Web报表设计器功能升级
    DevExpressReporting是.NETFramework下功能完善的报表平台,它附带了易于使用的VisualStudio报表设计器和丰富的报表控件集,包括数据透视表、图表,因此您可以构建无与伦比、信息清晰的报表界面组件DevExpressReportingv23.1已经发布一段时间了,新版本增强了Web报表设计器的自定义......
  • 最常用的5款报表系统
    在这个信息化飞速发展的时代,报表系统已经成为了企业管理和决策的重要工具。随着市场的需求不断增长,报表系统也在不断地更新和完善。如今,市面上有数不尽的报表系统,但是哪款才是最常用的呢?接下来,我们将为您揭晓最常用的5款报表系统。1.VeryReport报表系统VeryReport报表系统是一......
  • 报表系统是什么?如何快速帮助企业数字化转型?
    在信息洪流中,企业需要应对日益增长的数据量和复杂业务环境,这需要借助科技手段来驾驭数据管理和决策分析。报表系统,作为企业决策的重要工具,就如同航海的罗盘,帮助企业在数据的海洋中快速定位,从而提高管理效率和决策水平。本文将以VeryReport报表系统为例,揭示报表系统的奥秘以及如何助......
  • 中国最常用的制作报表的软件有哪些?
    随着信息化时代的浪潮席卷而来,报表制作软件已经成为了企业管理中的得力助手。在中国的大地上,有许多优秀的报表制作软件,而本文将为您揭示五位佼佼者,其中更以VeryReport报表软件为首选。编辑搜图请点击输入图片描述(最多18字)首先,MicrosoftExcel无疑是办公领域的明星产品,其数据处理和......
  • 2023-11-22 Invariant Violation: [app.model] namespace should be unique ==》模块
     如上图,报错原因:存在多个名为demoDataSource的模块名称导致报错解决方案:修改模块名称即可,把demoDataSource改为demoDataSource2就不会报错了扩展:该问题是由rudex引起的,redex要求数据模型(models)命名(namespace)必须不同,否则在注入该数据模型时就会报错......
  • vue 下载文件并且重命名
    <el-buttontype="primary"@click="xz(scope.row)"size="small">下载</el-button>methods内定义方法xz(row){this.getBlob(row.value,(blob)=>{this.saveAs(blob,row.title)......