本头条号主要是java常用关键技术点,通用工具类的分享;以及springboot+springcloud+mybatisplus+druid+mysql+redis+swagger+maven+docker等集成框架的技术分享;datax、kafka、flink等大数据处理框架的技术分享。文章会不断更新,欢迎码友关注点赞收藏转发!
关注多的话,后面会录制一些视频教程,图文和视频结合,比如:图书介绍网站系统、抢购系统、大数据中台系统等。技术才是程序猿的最爱,码友们交谊舞教学冲啊
正文
在java开发中,几乎所有系统都有报表统计的功能,而报表统计的其中一个参数就是时间段,有环比同比时间段统计,有时间段统计,有周统计,有趋势图统计等,所以封装了该工具类,避免在每个统计方法中重复的计算这样那样的日期。
照旧先上工具类使用栗子:
system.out.println("201909环比日期="+reportdateutil.gethbmonth("201909")); system.out.println("201909同比日期="+reportdateutil.gettbmonth("201909")); system.out.println("201901-201909相隔月数="+reportdateutil.getperiodamount("20190101", "20190901", reportdateutil.month)); // 用于趋势图中显示日期,当统计值为0时也是要显示的哦 system.out.println("201901-201909之间的日期列表="+reportdateutil.getperioddatelist("20190101", "20190901", reportdateutil.month)); reportdateutil.getmonthweekgrouplist("201909").foreach((k, v) -> { // 计算9月份共有多少周,每周的日期 system.out.println("201909第"+k+"周:"+v.tostring()); }); system.out.println("201909中的自然周为="+reportdateutil.getmonthweeklist("201909"));
上面使用例子打印如下
201909环比日期=201908 201909同比日期=201809 201901-201909相隔月数=8 201901-201909之间的日期列表=[201901, 201902, 201903, 201904, 201905, 201906, 201907, 201908, 201909] 201909第1周:[2019-09-01, 2019-09-02, 2019-09-03, 2019-09-04, 2019-09-05, 2019-09-06, 2019-09-07] 201909第2周:[2019-09-08, 2019-09-09, 2019-09-10, 2019-09-11, 2019-09-12, 2019-09-13, 2019-09-14] 201909第3周:[2019-09-15, 2019-09-16, 2019-09-17, 2019-09-18, 2019-09-19, 2019-09-20, 2019-09-21] 201909第4周:[2019-09-22, 2019-09-23, 2019-09-24, 2019-09-25, 2019-09-26, 2019-09-27, 2019-09-28] 201909第5周:[2019-09-29, 2019-09-30] 201909中的自然周为=[201939, 201936, 201938, 201937, 201940]
下面给出完整的工具类,这是我项目中在报表统计时经常用到的,有需要的码友可以先收藏,说不定哪天就用到了。
import j文理分科如何选择ava.time.dayofweek;import java.time.localdate;import java.time.period;import java.time.yearmonth;import java.time.format.datetimeformatter;import java.time.temporal.chronounit;import java.time.temporal.temporaladjusters;import java.time.temporal.weekfields;import java.util.arraylist;import java.util.list;import java.util.map;import java.util.stream.collectors;import java.util.stream.stream;/*** 报表日期工具类** @author liang - liangxn* @date 2019/9/19 10:17*/public class reportdateutil {private static final datetimeformatter dtf_yyyymmdd = datetimeformatter.ofpattern("yyyymmdd");private static final datetimeformatter dtf_yyyymm = datetimeformatter.ofpattern("yyyymm");private static final datetimeformatter dtf_yyyy = datetimeformatter.ofpattern("yyyy");private static final string pattern_week = "yyyyw";public static final int year = 1;public static final int month = 2;public static final int day = 3;public static void main(string[] args) {system.out.println("201909环比日期="+reportdateutil.gethbmonth("201909"));system.out.println("201909同比日期="+reportdateutil.gettbmonth("201909"));system.out.println("201901-201909相隔月数="+reportdateutil.getperiodamount("20190101", "20190901", reportdateutil.month));system.out.println("201901-201909之间的日期列表="+reportdateutil.getperioddatelist("20190101", "20190901", reportdateutil.month));reportdateutil.getmonthweekgrouplist("201909").foreach((k, v) -> {system.out.println("201909第"+k+"周:"+v.tostring());});system.out.println("201909中的自然周为="+reportdateutil.getmonthweeklist("201909"));}/*** 获取月的第一天** @param currmonth 当前日期字符串,格式yyyymm* @return*/public static string getfirstofmonth(传统节string currmonth) {currmonth = currmonth + "01";localdate d = localdate.par(currmonth, dtf_yyyymmdd);return dtf_yyyymmdd.format(d.with(temporaladjusters.firstdayofmonth()));}/*** 获取月的最后一天** @param currmonth 当前日期字符串,格式yyyymm* @return*/public static string getlastofmonth(string currmonth) {currmonth = currmonth + "01";localdate d = localdate.par(currmonth, dtf_yyyymmdd);return dtf_yyyymmdd.format(d.with(temporaladjusters.lastdayofmonth()));}/*** 获取年的第一天** @param curryear 当前日期字符串,格式yyyy* @return*/public static string getfirstofyear(string curryear) {curryear = curryear + "0101";localdate d = localdate.par(curryear, dtf_yyyymmdd);return dtf_yyyymmdd.format(d.with(temporaladjusters.firstdayofyear()));}/*** 获取年的最后一天** @param curryear 当前日期字符串,格式yyyy* @return*/public static string getlastofyear(string curryear) {curryear = curryear + "0101";localdate d = localdate.par(curryear, dtf_yyyymmdd);return dtf_yyyymmdd.format(d.with(temporaladjusters.lastdayofyear()));}/*** 计算环比月** @param currmonth 当前日期字符串,格式yyyymm* @return*/public static string gethbmonth(string currmonth) {currmonth = currmonth + "01";localdate d = localdate.par(currmonth, dtf_yyyymmdd);return dtf_yyyymm.format(d.minusmonths(1l));}/*** 计算同比月** @param currmonth 当前日期字符串,格式yyyymm* @return*/public static string gettbmonth(string currmonth) {currmonth = currmonth + "01";localdate d = localdate.par(currmonth, dtf_yyyymmdd);return dtf_yyyymm.format(d.minusyears(1l));}/*** 计算两个日期之间的年(或月或日)的集合** @param startdate 开始的日期 yyyymmdd* @param enddate 结束的日期 yyyymmdd* @param unit 年(或月或日)的标识,默认日* @return*/public static list<string> getperioddatelist(string startdate, string enddate, int unit) {list<string> l = new arraylist<>();localdate start = localdate.par(startdate, dtf_yyyymmdd);localdate end = localdate.par(enddate, dtf_yyyymmdd);period p = period.between(start, end);if (reportdateutil.year == unit) {for (int i = 0; i <= p.getyears(); i++) {l.add(dtf_yyyy.format(start.plusyears(i)));}} el if (reportdateutil.month == unit) {for (int i = 0; i <= p.getmonths(); i++) {l.add(dtf_yyyymm.format(start.plusmonths(i)));}} el if (reportdateutil.day == unit) {for (int i = 0; i <= p.getdays(); i++) {l.add(dtf_yyyymmdd.format(start.plusdays(i)));}}return l;}/*** 计算两个日期之间的年(或月或日)的集合** @param startdate 开始的日期 yyyymmdd* @param enddate 结束的日期 yyyymmdd* @param unit 年(或月或日)的标识,默认日* @return*/public static list<string> getperioddatelist(string startdate, string enddate, int unit, string pattern) {datetimeformatter dtf = datetimeformatter.ofpattern(pattern);list<string> l = new arraylist<>();localdate start = localdate.par(startdate, dtf_yyyymmdd);localdate end = localdate.par(enddate, dtf_yyyymmdd);period p = period.between(start, end);if (reportdateutil.year == unit) {for (int i = 0; i <= p.getyears(); i++) {l.add(dtf.format(start.plusyears(i)));}} el if (reportdateutil.month == unit) {for (int i = 0; i <= p.getmonths(); i++) {l.add(dtf.format(start.plusmonths(i)));}} el if (reportdateutil.day == unit) {for (int i = 0; i <= p.getdays(); i++) {l.add(dtf.format(start.plusdays(i)));}}return l;}/*** 计算某个月的的每一周在一年中属于第几周的集合,如2019年9月有6周(周一为一周开始),则返回结果为:[201934,201935,201936,201937,201938,201939]** @param currmonth 年月字符串 yyyymm* @return*/public static list<string> getmonthweeklist(string currmonth) {return getmonthweeklist(currmonth, pattern_week);}/*** 计算某个月的的每一周在一年中属于第几周的集合,如2019年9月有6周(周一为一周开始),则返回结果为:[201934,201935,201936,201937,201938,201939]** @param currmonth 年月字符串 yyyymm* @return*/public static list<string> getmonthweeklist(string currmonth, string pattern) {final datetimeformatter dtf_week = datetimeformatter.ofpattern(pattern);yearmonth yearmonth = yearmonth.par(currmonth, dtf_yyyymm);localdate start = localdate.now().with(yearmonth).with(temporaladjusters.firstdayofmonth());localdate end = localdate.now().with(yearmonth).with(temporaladjusters.lastdayofmonth());if(end.isafter(localdate.now())){end = localdate.now();}// 按周分组,设置一周的开始日期为 星期天map<string, list<localdate>> collect = stream.iterate(start, localdate -> localdate.plusdays(1l)).limit(chronounit.days.between(start, end) + 1).collect(collectors.groupingby(localdate -> dtf_week.format(localdate)));list<string> l = new arraylist<>();collect.foreach((k, v) -> l.add(k));return l;}/*** 计算某个月的自然周数的集合,按周分组,并列出每周的天日期,例如201909月有5周,每周的日期如下:* 第1周:[2019-09-01, 2019-09-02, 2019-09-03, 2019-09-04, 2019-09-05, 2019-09-06, 2019-09-07]* 第2周:电力专业大学排名[2019-09-08, 2019-09-09, 2019-09-10, 2019-09-11, 2019-09-12, 2019-09-13, 2019-09-14]* 第3周:[2019-09-15, 2019-09-16, 2019-09-17, 2019-09-18, 2019-09-19, 2019-09-20, 2019-09-21]* 第4周:[2019-09-22, 2019-09-23, 2019-09-24, 2019-09-25, 2019-09-26, 2019-09-27, 2019-09-28]* 第5周:[2019-09-29, 2019-09-30]** @param currmonth 年月字符串 yyyymm* @return*/public static map<integer, list<localdate>> getmonthweekgrouplist(string currmonth) {yearmonth yearmonth = yearmonth.par(currmonth, dtf_yyyymm);localdate start = localdate.now().with(yearmonth).with(temporaladjusters.firstdayofmonth());localdate end = localdate.now().with(yearmonth).with(temporaladjusters.lastdayofmonth());// 按周分组,设置一周的开始日期为 星期天return stream.iterate(start, localdate -> localdate.plusdays(1l)).limit(chronounit.days.between(start, end) + 1).collect(collectors.groupingby(localdate ->localdate.get(weekfields.of(dayofweek.sunday, 1).weekofmonth())));}/*** 计算两个日期相隔多少年(或月或日)** @param startdate 开始的日期 yyyymmdd* @param enddate 结束的日期 yyyymmdd* @param unit 计算年(或月或日)的标识,默认日* @return*/public static int getperiodamount(string startdate, string enddate, int unit) {localdate start = localdate.par(startdate, dtf_yyyymmdd);localdate end = localdate.par(enddate, dtf_yyyymmdd);period p = period.between(start, end);if (reportdateutil.year == unit) {return p.getyears();} el if (reportdateutil.month == unit) {return p.getmonths();}return p.getdays();}}
大部分系统都是有图表统计的,有图表统计的话基本都能使用到这个工具类。这也是我在多个项目中都用到,所以封装了这个工具类什么眼镜好。
本文发布于:2023-04-05 05:39:25,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/5df38f7fa598ae9f3a397e4f75b18b27.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:报表统计怎么做(月报表的统计制作方法).doc
本文 PDF 下载地址:报表统计怎么做(月报表的统计制作方法).pdf
留言与评论(共有 0 条评论) |