本头条号主要是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();}}
推荐阅读
- 越南大规模反腐行动,越南警察队伍为何成为了重灾区?
- 最火十大完结科幻末世小说 好看的丧尸小说排行榜前十名
- 现已为人妻 从学生时期在一起快8年的前女友,我应不应该给她寄100个口罩?(她闺蜜前天找我要口罩)?
- 假如韩国确诊超过30000,会对中国有影响吗?
- 女人的第六感有多准?
- 创新Aurvana Live SE 创新Aurvana
- 太平洋战争日本一点胜算都没有吗?
- 创新Aurvana 创新Aurvana Live SE
- 创新Aurvana 创新Aurvana Trio Wireless