本头条号主要是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环比日期=201908201909同比日期=201809201901-201909相隔月数=8201901-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]
下面给出完整的工具类。这是我项目中在报表统计时经常用到的。有需要的码友可以先收藏。说不定哪天就用到了。
importjava.time.DayOfWeek;importjava.time.LocalDate;importjava.time.Period;importjava.time.YearMonth;importjava.time.format.DateTimeFormatter;importjava.time.temporal.ChronoUnit;importjava.time.temporal.TemporalAdjusters;importjava.time.temporal.WeekFields;importjava.util.ArrayList;importjava.util.List;importjava.util.Map;importjava.util.stream.Collectors;importjava.util.stream.Stream;/***报表日期工具类**@authorliang-liangxn*@date2019/9/1910:17*/publicclassReportDateUtil{privatestaticfinalDateTimeFormatterDTF_YYYYMMDD=DateTimeFormatter.ofPattern("yyyyMMdd");privatestaticfinalDateTimeFormatterDTF_YYYYMM=DateTimeFormatter.ofPattern("yyyyMM");privatestaticfinalDateTimeFormatterDTF_YYYY=DateTimeFormatter.ofPattern("yyyy");privatestaticfinalStringPATTERN_WEEK="yyyyw";publicstaticfinalintYEAR=1;publicstaticfinalintMONTH=2;publicstaticfinalintDAY=3;publicstaticvoidmain(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"));}/***获取月的第一天**@paramcurrMonth当前日期字符串。格式yyyyMM*@return*/publicstaticStringgetFirstOfMonth(StringcurrMonth){currMonth=currMonth+"01";LocalDated=LocalDate.parse(currMonth,DTF_YYYYMMDD);returnDTF_YYYYMMDD.format(d.with(TemporalAdjusters.firstDayOfMonth()));}/***获取月的最后一天**@paramcurrMonth当前日期字符串。格式yyyyMM*@return*/publicstaticStringgetLastOfMonth(StringcurrMonth){currMonth=currMonth+"01";LocalDated=LocalDate.parse(currMonth,DTF_YYYYMMDD);returnDTF_YYYYMMDD.format(d.with(TemporalAdjusters.lastDayOfMonth()));}/***获取年的第一天**@paramcurrYear当前日期字符串。格式yyyy*@return*/publicstaticStringgetFirstOfYear(StringcurrYear){currYear=currYear+"0101";LocalDated=LocalDate.parse(currYear,DTF_YYYYMMDD);returnDTF_YYYYMMDD.format(d.with(TemporalAdjusters.firstDayOfYear()));}/***获取年的最后一天**@paramcurrYear当前日期字符串。格式yyyy*@return*/publicstaticStringgetLastOfYear(StringcurrYear){currYear=currYear+"0101";LocalDated=LocalDate.parse(currYear,DTF_YYYYMMDD);returnDTF_YYYYMMDD.format(d.with(TemporalAdjusters.lastDayOfYear()));}/***计算环比月**@paramcurrMonth当前日期字符串。格式yyyyMM*@return*/publicstaticStringgetHbMonth(StringcurrMonth){currMonth=currMonth+"01";LocalDated=LocalDate.parse(currMonth,DTF_YYYYMMDD);returnDTF_YYYYMM.format(d.minusMonths(1L));}/***计算同比月**@paramcurrMonth当前日期字符串。格式yyyyMM*@return*/publicstaticStringgetTbMonth(StringcurrMonth){currMonth=currMonth+"01";LocalDated=LocalDate.parse(currMonth,DTF_YYYYMMDD);returnDTF_YYYYMM.format(d.minusYears(1L));}/***计算两个日期之间的年(或月或日)的集合**@paramstartDate开始的日期yyyyMMdd*@paramendDate结束的日期yyyyMMdd*@paramunit年(或月或日)的标识。默认日*@return*/publicstaticList<String>getPeriodDateList(StringstartDate,StringendDate,intunit){List<String>l=newArrayList<>();LocalDatestart=LocalDate.parse(startDate,DTF_YYYYMMDD);LocalDateend=LocalDate.parse(endDate,DTF_YYYYMMDD);Periodp=Period.between(start,end);if(ReportDateUtil.YEAR==unit){for(inti=0;i<=p.getYears();i++){l.add(DTF_YYYY.format(start.plusYears(i)));}}elseif(ReportDateUtil.MONTH==unit){for(inti=0;i<=p.getMonths();i++){l.add(DTF_YYYYMM.format(start.plusMonths(i)));}}elseif(ReportDateUtil.DAY==unit){for(inti=0;i<=p.getDays();i++){l.add(DTF_YYYYMMDD.format(start.plusDays(i)));}}returnl;}/***计算两个日期之间的年(或月或日)的集合**@paramstartDate开始的日期yyyyMMdd*@paramendDate结束的日期yyyyMMdd*@paramunit年(或月或日)的标识。默认日*@return*/publicstaticList<String>getPeriodDateList(StringstartDate,StringendDate,intunit,Stringpattern){DateTimeFormatterdtf=DateTimeFormatter.ofPattern(pattern);List<String>l=newArrayList<>();LocalDatestart=LocalDate.parse(startDate,DTF_YYYYMMDD);LocalDateend=LocalDate.parse(endDate,DTF_YYYYMMDD);Periodp=Period.between(start,end);if(ReportDateUtil.YEAR==unit){for(inti=0;i<=p.getYears();i++){l.add(dtf.format(start.plusYears(i)));}}elseif(ReportDateUtil.MONTH==unit){for(inti=0;i<=p.getMonths();i++){l.add(dtf.format(start.plusMonths(i)));}}elseif(ReportDateUtil.DAY==unit){for(inti=0;i<=p.getDays();i++){l.add(dtf.format(start.plusDays(i)));}}returnl;}/***计算某个月的的每一周在一年中属于第几周的集合。如2019年9月有6周(周一为一周开始)。则返回结果为:[201934,201935,201936,201937,201938,201939]**@paramcurrMonth年月字符串yyyyMM*@return*/publicstaticList<String>getMonthWeekList(StringcurrMonth){returngetMonthWeekList(currMonth,PATTERN_WEEK);}/***计算某个月的的每一周在一年中属于第几周的集合。如2019年9月有6周(周一为一周开始)。则返回结果为:[201934,201935,201936,201937,201938,201939]**@paramcurrMonth年月字符串yyyyMM*@return*/publicstaticList<String>getMonthWeekList(StringcurrMonth,Stringpattern){finalDateTimeFormatterDTF_WEEK=DateTimeFormatter.ofPattern(pattern);YearMonthyearMonth=YearMonth.parse(currMonth,DTF_YYYYMM);LocalDatestart=LocalDate.now().with(yearMonth).with(TemporalAdjusters.firstDayOfMonth());LocalDateend=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=newArrayList<>();collect.forEach((k,v)->l.add(k));returnl;}/***计算某个月的自然周数的集合。按周分组。并列出每周的天日期。例如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]**@paramcurrMonth年月字符串yyyyMM*@return*/publicstaticMap<Integer,List<LocalDate>>getMonthWeekGroupList(StringcurrMonth){YearMonthyearMonth=YearMonth.parse(currMonth,DTF_YYYYMM);LocalDatestart=LocalDate.now().with(yearMonth).with(TemporalAdjusters.firstDayOfMonth());LocalDateend=LocalDate.now().with(yearMonth).with(TemporalAdjusters.lastDayOfMonth());//按周分组。设置一周的开始日期为星期天returnStream.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())));}/***计算两个日期相隔多少年(或月或日)**@paramstartDate开始的日期yyyyMMdd*@paramendDate结束的日期yyyyMMdd*@paramunit计算年(或月或日)的标识。默认日*@return*/publicstaticintgetPeriodAmount(StringstartDate,StringendDate,intunit){LocalDatestart=LocalDate.parse(startDate,DTF_YYYYMMDD);LocalDateend=LocalDate.parse(endDate,DTF_YYYYMMDD);Periodp=Period.between(start,end);if(ReportDateUtil.YEAR==unit){returnp.getYears();}elseif(ReportDateUtil.MONTH==unit){returnp.getMonths();}returnp.getDays();}}
大部分系统都是有图表统计的。有图表统计的话基本都能使用到这个工具类。这也是我在多个项目中都用到。所以封装了这个工具类。
您还感兴趣的文章推荐- 女娲图片真身吓人 女娲图片真身吓死人
- 韩国r级电影排行榜,十大韩国r级电影推荐
- 快手刷评论会不会被人发现 快手刷评论是否会被发觉
- 11月发朋友圈早晨精美句子 十一月你好朋友圈个性说说
- 有内涵的句子简短 优美有内涵的句子摘选
以上就是由互联网推广工程师 网创网 整理编辑的,如果觉得有帮助欢迎收藏转发~
本文地址:https://www.wangchuang8.com/85495.html,转载请说明来源于:网创推广网
声明:本站部分文章来自网络,如无特殊说明或标注,均为本站原创发布。如若本站内容侵犯了原著者的合法权益,可联系进行处理。分享目的仅供大家学习与参考,不代表本站立场。
评论(2)
出入库报表统计怎么做 入库出库库存自动计算库存方法 这篇解答确实也是太好了
日期,字符串,工具,格式,环比,报表,时间段,自然,系统,标识
本头条号主要是java常用关键技术点。通用工具类的分享;以及springboot+springcloud+Mybatis