package com.ruoyi.ad.util; import java.text.SimpleDateFormat; import java.time.*; import java.time.temporal.ChronoUnit; import java.time.temporal.TemporalAdjusters; import java.time.temporal.WeekFields; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import java.util.stream.Stream; /** * @author: 谢辉 * @date: 2021/4/14 * @email: xieh_mail@163.com * @description: 获取每个月有几周,并且每周的开始日期和结束日期 * 国内都是以周一开始,注:即使第一天是周末,也算一周 * @modifiedBy: * @version: 1.0 */ public class AdDateUtils { /** * 获取指定月份有几周,每周的开始日期和结束日期 * * @param yearMonth * @return */ public static Map<Integer, WeekData> weeks(YearMonth yearMonth) { // 获取指定月份的第一天 LocalDate start = LocalDate.now().with(yearMonth).with(TemporalAdjusters.firstDayOfMonth()); // 获取指定月份的最后一天 LocalDate end = LocalDate.now().with(yearMonth).with(TemporalAdjusters.lastDayOfMonth()); Map<Integer, WeekData> map = Stream.iterate(start, localDate -> localDate.plusDays(1l)) .limit(ChronoUnit.DAYS.between(start, end) + 1) // DayOfWeek.MONDAY 这里是指定周一(MONDAY)为一周的开始 .collect(Collectors.groupingBy(localDate -> localDate.get(WeekFields.of(DayOfWeek.MONDAY, 1).weekOfMonth()), Collectors.collectingAndThen(Collectors.toList(), WeekData::new))); return map; } /** * 获取指定时期的后面月份的第一天开始时间 * * @param startDate 开始时间 * @param month 第几个月 * @return */ public static Date getMonthDate(Date startDate, int month) { LocalDateTime localDateTime = startDate.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime().plusMonths(month); Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); return date; } public static class WeekData { // 一周的开始时间 private LocalDate start; // 一周的结束时间 private LocalDate end; public WeekData(List<LocalDate> localDates) { this.start = localDates.get(0); this.end = localDates.get(localDates.size() - 1); } @Override public String toString() { return this.start + "~" + this.end; } } public static void main(String[] args) throws Exception { System.out.println(weeks(YearMonth.of(2021, 4))); String targetStr = YearMonth.now().toString() + "-01"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = getMonthDate(sdf.parse(targetStr), 2); System.out.println("后2个月的时间:" + sdf.format(date)); } }
package com.demo; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.YearMonth; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.List; /** * 计算两个月份相隔的明细 * @author XH * */ public class TestDate { public static int getDay(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.DATE); } /** * 返回日期的月份,1-12,即yyyy-MM-dd中的MM * * @param date * @return */ public static int getMonth(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.MONTH) + 1; } /** * 返回日期的年,即yyyy-MM-dd中的yyyy * * @param date * Date * @return int */ public static int getYear(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.YEAR); } public static int getDaysOfMonth(int year, int month) { Calendar calendar = Calendar.getInstance(); calendar.set(year, month - 1, 1); return calendar.getActualMaximum(Calendar.DAY_OF_MONTH); } public static int calDiffMonth(String startDate,String endDate){ int result=0; try { SimpleDateFormat sfd=new SimpleDateFormat("yyyy-MM"); Date start = sfd.parse(startDate); Date end = sfd.parse(endDate); int startYear=getYear(start); int startMonth=getMonth(start); int startDay=getDay(start); int endYear=getYear(end); int endMonth=getMonth(end); int endDay=getDay(end); if (startDay>endDay){ //1月17 大于 2月28 if (endDay==getDaysOfMonth(getYear(new Date()),2)){ //也满足一月 result=(endYear-startYear)*12+endMonth-startMonth; }else{ result=(endYear-startYear)*12+endMonth-startMonth-1; } }else{ result=(endYear-startYear)*12+endMonth-startMonth; } } catch (ParseException e) { e.printStackTrace(); } return result; } public static List<String> getBetweenDateByMonth(String startDate,String endDate){ List<String> results = new ArrayList<String>(); // 判断两个月份的间隔数量 int count = calDiffMonth(startDate,endDate); // 如果两个日期相等 if(count == 0) { results.add(startDate); results.add(endDate); return results; } if(count > 0) { YearMonth now = YearMonth.parse(startDate, DateTimeFormatter.ofPattern("yyyy-MM")); results.add(startDate); for (int i = 1; i <= count; i++) { // 参数-1 是获取下个月的月份 YearMonth nextMonths = now.minusMonths(-i); results.add(nextMonths.toString()); } return results; } if(count < 0) { YearMonth now = YearMonth.parse(startDate, DateTimeFormatter.ofPattern("yyyy-MM")); results.add(startDate); count = Math.abs(count); for (int i = 1; i <= count; i++) { // 参数1 是获取上个月的月份 YearMonth nextMonths = now.minusMonths(i); results.add(nextMonths.toString()); } Collections.reverse(results); return results; //return results; } return results; } public static void main(String[] args) { List<String> betweenDateByMonth = getBetweenDateByMonth("2020-04", "2020-08"); System.out.println(betweenDateByMonth.toString()); } }