package com.zhgd.xmgl.util; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.zhgd.jeecg.common.execption.OpenAlertException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.time.DateFormatUtils; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * @program: wisdomSite * @description: 日期格式 * @author: Mr.Peng * @create: 2020-12-15 17:05 **/ @Slf4j public class DateUtils { /** * 验证日期段格式,日期格式:yyyy-MM-dd 或 yyyy/MM/dd 或 yyyy.MM.dd 或 yyyy年MM月dd日,分割符号:到——~至— * * @param input * @return */ public static boolean validateDateRange(String input) { if (StrUtil.isBlank(input)) { return true; } return parseDateRange(input) != null; } /** * 解析日期段格式,日期格式:yyyy-MM-dd 或 yyyy/MM/dd 或 yyyy.MM.dd 或 yyyy年MM月dd日,分割符号:到——~至— * * @param input * @return */ public static List parseDateRange(String input) { input = StrUtil.trim(input); String regex = "^\\s*" + "(?:" + // 标准格式:yyyy-MM-dd 或 yyyy/MM/dd 或 yyyy.MM.dd "(?\\d{4})[-/.]?(?\\d{1,2})[-/.]?(?\\d{1,2})" + "|" + // 中文格式:yyyy年MM月dd日 "(?\\d{4})\\s*年\\s*(?\\d{1,2})\\s*月\\s*(?\\d{1,2})\\s*日" + ")" + "\\s*" + // 分隔符 "(?到|至|——|—|~|--+)" + "\\s*" + "(?:" + // 标准格式结束日期 "(?\\d{4})[-/.]?(?\\d{1,2})[-/.]?(?\\d{1,2})" + "|" + // 中文格式结束日期 "(?\\d{4})\\s*年\\s*(?\\d{1,2})\\s*月\\s*(?\\d{1,2})\\s*日" + ")" + "\\s*$"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); if (matcher.find()) { try { // 解析开始日期 int startYear, startMonth, startDay; if (matcher.group("stdStartY") != null) { // 标准格式 startYear = Integer.parseInt(matcher.group("stdStartY")); startMonth = Integer.parseInt(matcher.group("stdStartM")); startDay = Integer.parseInt(matcher.group("stdStartD")); } else { // 中文格式 startYear = Integer.parseInt(matcher.group("cnStartY")); startMonth = Integer.parseInt(matcher.group("cnStartM")); startDay = Integer.parseInt(matcher.group("cnStartD")); } // 解析结束日期 int endYear, endMonth, endDay; if (matcher.group("stdEndY") != null) { // 标准格式 endYear = Integer.parseInt(matcher.group("stdEndY")); endMonth = Integer.parseInt(matcher.group("stdEndM")); endDay = Integer.parseInt(matcher.group("stdEndD")); } else { // 中文格式 endYear = Integer.parseInt(matcher.group("cnEndY")); endMonth = Integer.parseInt(matcher.group("cnEndM")); endDay = Integer.parseInt(matcher.group("cnEndD")); } LocalDate startDate = LocalDate.of(startYear, startMonth, startDay); LocalDate endDate = LocalDate.of(endYear, endMonth, endDay); return Arrays.asList(Date.from(startDate.atStartOfDay(ZoneId.systemDefault()).toInstant()), Date.from(endDate.atStartOfDay(ZoneId.systemDefault()).toInstant())); } catch (Exception e) { log.error("", e); return null; // 处理无效日期 } } return null; } public static void main(String[] args) { String[] testCases = { "2020-10-10到2020-10-11", "2020年10月10日——2020年10月11日", "2020/10/10~2020/10/11", "2020 年 1 月 5 日 至 2020 年 1 月 6 日", "2020.12.31—2021.01.01" }; for (String testCase : testCases) { List dates = parseDateRange(testCase); if (dates != null) { System.out.printf("输入: '%s'\n开始日期: %s\n结束日期: %s\n\n", testCase, dates.get(0), dates.get(1)); } else { System.out.printf("输入: '%s' 解析失败\n\n", testCase); } } } public static String dealDateFormat(String oldDate) { Date date1 = null; SimpleDateFormat df2 = null; try { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); Date date = df.parse(oldDate); Calendar beijingcal = Calendar.getInstance(); beijingcal.setTime(date); beijingcal.set(Calendar.HOUR, beijingcal.get(Calendar.HOUR) + 8); date1 = beijingcal.getTime(); df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } catch (ParseException e) { log.error("error:", e); } return df2.format(date1); } public static String parseDateFormat(String oldDate) { Date date = null; SimpleDateFormat df2 = null; try { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); date = df.parse(oldDate); df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } catch (ParseException e) { log.error("error:", e); } return df2.format(date); } public static List getNowWeekAllDayList() { Calendar cal = Calendar.getInstance(); // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了 // 获得当前日期是一个星期的第几天 int dayWeek = cal.get(Calendar.DAY_OF_WEEK); if (1 == dayWeek) { cal.add(Calendar.DAY_OF_MONTH, -1); } // log.info("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期 // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一 cal.setFirstDayOfWeek(Calendar.MONDAY); // 获得当前日期是一个星期的第几天 int day = cal.get(Calendar.DAY_OF_WEEK); // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值 cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day); return findDates(cal.getTime(), new Date()); } /** * 查询现在时间几天前到现在之间的所有日期 * * @param days * @return */ public static List getOtherDayAllDayList(int days) { Calendar cal = Calendar.getInstance(); cal.add(Calendar.DATE, -days); return findDates(cal.getTime(), new Date()); } public static List getNowMonthAllDayList() { Calendar cal = Calendar.getInstance(); cal.set(Calendar.DAY_OF_MONTH, 1); return findDates(cal.getTime(), new Date()); } /** * 获取两个时间段所有天数,2024-01-01到2024-01-02...到2025-01-01 * * @param beginTime 2024-01-01 * @param endTime 2025-01-01 * @return */ public static List getDiffTimeDayList(String beginTime, String endTime) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { return findDates(sdf.parse(beginTime), sdf.parse(endTime)); } catch (ParseException e) { log.error("error:", e); } return null; } public static List findDates(Date dBegin, Date dEnd) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); List lDate = new ArrayList(); lDate.add(sdf.format(dBegin)); Calendar calBegin = Calendar.getInstance(); // 使用给定的 Date 设置此 Calendar 的时间 calBegin.setTime(dBegin); Calendar calEnd = Calendar.getInstance(); // 使用给定的 Date 设置此 Calendar 的时间 calEnd.setTime(dEnd); // 测试此日期是否在指定日期之后 while (dEnd.after(calBegin.getTime())) { // 根据日历的规则,为给定的日历字段添加或减去指定的时间量 calBegin.add(Calendar.DAY_OF_MONTH, 1); if (calBegin.getTimeInMillis() <= dEnd.getTime()) { lDate.add(sdf.format(calBegin.getTime())); } } return lDate; } /** * 获取指定年份所有天数 * * @param yearMonth * @return */ public static List getYearAllMonthList(String yearMonth) { String year = yearMonth.substring(0, 4); List list = new ArrayList<>(); for (int i = 1; i <= 12; i++) { if (i < 10) { list.add(year + "0" + i); } else { list.add(year + i); } } return list; } /** * @param yearMonth 月份格式yyyy-MM * @return */ public static List getMonthDayList(String yearMonth) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); //判断是否是当月 if (yearMonth.equals(sdf.format(new Date()))) { return getNowMonthAllDayList(); } else { return getDayListOfMonth(yearMonth); } } public static List getDayListOfMonth(String yearMonth) { int year = Integer.parseInt(yearMonth.split("-")[0]); //年 int month = Integer.parseInt(yearMonth.split("-")[1]); //月 Calendar endCal = Calendar.getInstance(); // 设置年份 endCal.set(Calendar.YEAR, year); // 设置月份 endCal.set(Calendar.MONTH, month - 1); // 获取某月最大天数 int lastDay = endCal.getActualMaximum(Calendar.DATE); // 设置日历中月份的最大天数 endCal.set(Calendar.DAY_OF_MONTH, lastDay); Calendar startCal = Calendar.getInstance(); // 设置年份 startCal.set(Calendar.YEAR, year); // 设置月份 startCal.set(Calendar.MONTH, month - 1); //获取某月最小天数 int firstDay = startCal.getActualMinimum(Calendar.DAY_OF_MONTH); //设置日历中月份的最小天数 startCal.set(Calendar.DAY_OF_MONTH, firstDay); return findDates(startCal.getTime(), endCal.getTime()); } /** * 获取当前周第一天日期 * * @return */ public static String getNowWeekStartTime() { Calendar cal = Calendar.getInstance(); // 判断要计算的日期是否是周日,如果是则减一天计算周六的,否则会出问题,计算到下一周去了 // 获得当前日期是一个星期的第几天 int dayWeek = cal.get(Calendar.DAY_OF_WEEK); if (1 == dayWeek) { cal.add(Calendar.DAY_OF_MONTH, -1); } // log.info("要计算日期为:" + sdf.format(cal.getTime())); // 输出要计算日期 // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一 cal.setFirstDayOfWeek(Calendar.MONDAY); // 获得当前日期是一个星期的第几天 int day = cal.get(Calendar.DAY_OF_WEEK); // 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值 cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(cal.getTime()); } public static List getDiffTimeYearList(String beginTime, String endTime) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { return findYear(sdf.parse(beginTime), sdf.parse(endTime)); } catch (ParseException e) { log.error("error:", e); } return null; } public static List findYear(Date dBegin, Date dEnd) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy"); List lDate = new ArrayList(); lDate.add(sdf.format(dBegin)); Calendar calBegin = Calendar.getInstance(); // 使用给定的 Date 设置此 Calendar 的时间 calBegin.setTime(dBegin); Calendar calEnd = Calendar.getInstance(); // 使用给定的 Date 设置此 Calendar 的时间 calEnd.setTime(dEnd); // 测试此日期是否在指定日期之后 while (dEnd.after(calBegin.getTime())) { // 根据日历的规则,为给定的日历字段添加或减去指定的时间量 calBegin.add(Calendar.YEAR, 1); if (calBegin.getTimeInMillis() <= dEnd.getTime()) { lDate.add(sdf.format(calBegin.getTime())); } } return lDate; } public static List getDiffTimeMonthList(String beginTime, String endTime) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { return findMonth(sdf.parse(beginTime), sdf.parse(endTime)); } catch (ParseException e) { log.error("error:", e); } return null; } public static List findMonth(Date dBegin, Date dEnd) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); List lDate = new ArrayList(); lDate.add(sdf.format(dBegin)); Calendar calBegin = Calendar.getInstance(); // 使用给定的 Date 设置此 Calendar 的时间 calBegin.setTime(dBegin); Calendar calEnd = Calendar.getInstance(); // 使用给定的 Date 设置此 Calendar 的时间 calEnd.setTime(dEnd); // 测试此日期是否在指定日期之后 while (dEnd.after(calBegin.getTime())) { // 根据日历的规则,为给定的日历字段添加或减去指定的时间量 calBegin.add(Calendar.MONTH, 1); if (calBegin.getTimeInMillis() <= dEnd.getTime()) { lDate.add(sdf.format(calBegin.getTime())); } } return lDate; } public static List getDiffTimeWeekList(String beginTime, String endTime) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); LocalDate startDate = LocalDate.parse(beginTime, formatter); LocalDate endDate = LocalDate.parse(endTime, formatter); List lDate = new ArrayList(); while (endDate.isAfter(startDate)) { String start = startDate.format(formatter); if (startDate.getDayOfWeek() == DayOfWeek.SUNDAY) { lDate.add(start + "/" + start); } else { LocalDate sunday = startDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)); if (sunday.isAfter(endDate)) { lDate.add(start + "/" + endDate.format(formatter)); } else { lDate.add(start + "/" + sunday.format(formatter)); } } startDate = startDate.with(TemporalAdjusters.next(DayOfWeek.SUNDAY)).plusDays(1); } return lDate; } /** * 获取当前时间和当天时间几天前之间的所有天数 * * @param dayNum 当天时间以前具体几天 * @return */ public static List getNowFewDaysAgoList(int dayNum) { try { Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DATE, -dayNum); Date date = calendar.getTime(); return findDates(date, new Date()); } catch (Exception e) { log.error("error:", e); } return null; } /** * @param type 1 今日24 小时,2本周所有天,3本月所有天 * @return */ public static List getDayList(Integer type) { if (type == 1) { List list = new ArrayList<>(); for (int i = 0; i <= 23; i++) { list.add(i + ""); } return list; } else if (type == 2) { return getDateTimeStrList(60, "yyyy-MM-dd"); } else if (type == 3) { return getNowMonthAllDayList(); } return null; } /** * 比较两个日期大小 * * @param time1 * @param time2 * @return * @throws ParseException */ public static boolean compareTime(String time1, String time2) { try { //如果想比较日期则写成"yyyy-MM-dd"就可以了 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //将字符串形式的时间转化为Date类型的时间 Date a = sdf.parse(time1); Date b = sdf.parse(time2); //Date类的一个方法,如果a早于b返回true,否则返回false //a时间下雨b时间返回true,否正返回false if (a.before(b)) { return true; } else { return false; } } catch (Exception e) { log.error("error:", e); } return false; } /** * 查询当前时间指定天数之前的日期 * * @param @param days * @param @return 参数 * @return String 返回类型 * @throws * @Title: getBeginDayTime */ public static String getBeginDayTime(int days) { Calendar cal = Calendar.getInstance(); cal.add(Calendar.DATE, -days); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return sdf.format(cal.getTime()); } /** * 转成GMT时间 * * @param date */ public static String getGMTTime(Date date) { DateFormat dateFormat = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH); dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); return dateFormat.format(date); } /** * 查询N天前的所有天数,如:2023-06-10到2023-06-15 * * @return */ public static List getDaysBefore(int days) { ArrayList rtList = new ArrayList<>(); DateTime dateTime = DateUtil.parseDate(DateUtil.today()); for (int i = 0; i < days; i++) { rtList.add(DateUtil.formatDate(DateUtil.offsetDay(dateTime, i * (-1)))); } Collections.reverse(rtList); return rtList; } /** * 查询指定天数内所有天数列表, 返回:如:[07-30, 07-31] * * @param queryStartTime 2023-07-31 * @param queryEndTime 2023-07-31 * @return */ public static List getBetweenDays(String queryStartTime, String queryEndTime, String format) { ArrayList rtList = new ArrayList<>(); DateTime beginDate = DateUtil.parseDate(queryStartTime); DateTime endDate = DateUtil.parseDate(queryEndTime); long offset = DateUtil.betweenDay(beginDate, endDate, true); for (int i = 0; i < offset + 1; i++) { rtList.add(DateUtil.format(DateUtil.offsetDay(beginDate, i), format)); } return rtList; } /** * 偏移日期str,传入2023-11-02返回2023-11-02,传入2023-11-02 00:00:00返回2023-11-02 00:00:00 * * @param dayStr * @param offset * @return */ public static String offsetDayStr(String dayStr, int offset) { if (dayStr.length() == 10) { return DateUtil.formatDate(DateUtil.offsetDay(DateUtil.parse(dayStr), offset)); } else { return DateUtil.format(DateUtil.offsetDay(DateUtil.parse(dayStr), offset), "yyyy-MM-dd HH:mm:ss"); } } /** * 获取所有日期时间列表 * * @param type 类型: * 10.近12小时,20.近24小时(每小时),30.近半天,40.近一天,50.近两天,60.近一周(每天),70.近两周,72.近15天(每天),80.近一个月(每天),90.近半年(每月),93.近一年(每月) * 100.今天(每小时),200.昨天,300.本周,400.本月(每天),500.本年(每月),600.去年 * @param pattern 格式 如:yyyy-MM-dd HH:mm:ss * @return */ public static List getDateTimeStrList(int type, String pattern) { if (type == 20) { //近24小时(每小时),eg:HH:00 ArrayList rtList = new ArrayList<>(); DateTime beginDate = DateUtil.yesterday(); DateTime endDate = DateTime.now(); long offset = DateUtil.between(beginDate, endDate, DateUnit.HOUR); for (int i = 1; i < offset + 1; i++) { rtList.add(DateUtil.format(DateUtil.offsetHour(beginDate, i), pattern)); } return rtList; } else if (type == 60) { //近一周(每天) ArrayList rtList = new ArrayList<>(); DateTime beginDate = DateUtil.lastWeek(); DateTime endDate = DateTime.now(); long offset = DateUtil.betweenDay(beginDate, endDate, true); for (int i = 1; i < offset + 1; i++) { rtList.add(DateUtil.format(DateUtil.offsetDay(beginDate, i), pattern)); } return rtList; } else if (type == 72) { //近15天(每天) ArrayList rtList = new ArrayList<>(); DateTime dateTime = DateUtil.parseDate(DateUtil.today()); for (int i = 0; i < 15; i++) { rtList.add(DateUtil.format(DateUtil.offsetDay(dateTime, i * (-1)), pattern)); } Collections.reverse(rtList); return rtList; } else if (type == 80) { //近一个月(每天) ArrayList rtList = new ArrayList<>(); DateTime beginDate = DateUtil.lastMonth(); DateTime endDate = DateTime.now(); long offset = DateUtil.betweenDay(beginDate, endDate, true); for (int i = 0; i < offset + 1; i++) { rtList.add(DateUtil.format(DateUtil.offsetDay(beginDate, i), pattern)); } return rtList; } else if (type == 90) { //近半年(每月) ArrayList rtList = new ArrayList<>(); DateTime endDate = DateTime.now(); DateTime beginDate = DateUtil.offsetMonth(endDate, -6); long offset = DateUtil.betweenMonth(beginDate, endDate, true); for (int i = 1; i < offset + 1; i++) { rtList.add(DateUtil.format(DateUtil.offsetMonth(beginDate, i), pattern)); } return rtList; } else if (type == 93) { //近一年(每月) ArrayList rtList = new ArrayList<>(); DateTime endDate = DateTime.now(); DateTime beginDate = DateUtil.offsetMonth(endDate, -12); long offset = DateUtil.betweenMonth(beginDate, endDate, true); for (int i = 1; i < offset + 1; i++) { rtList.add(DateUtil.format(DateUtil.offsetMonth(beginDate, i), pattern)); } return rtList; } else if (type == 100) { //100.今天(每小时) ArrayList rtList = new ArrayList<>(); DateTime beginDate = DateUtil.beginOfDay(DateTime.now()); DateTime endDate = DateUtil.endOfDay(DateTime.now()); long offset = DateUtil.between(beginDate, endDate, DateUnit.HOUR); for (int i = 0; i < offset + 1; i++) { rtList.add(DateUtil.format(DateUtil.offsetHour(beginDate, i), pattern)); } return rtList; } else if (type == 400) { //本月(每天) ArrayList rtList = new ArrayList<>(); Date now = new Date(); DateTime beginDate = DateUtil.beginOfMonth(now); DateTime endDate = DateUtil.endOfMonth(now); long offset = DateUtil.betweenDay(beginDate, endDate, true); for (int i = 0; i < offset + 1; i++) { rtList.add(DateUtil.format(DateUtil.offsetDay(beginDate, i), pattern)); } return rtList; } else if (type == 500) { //本年(每月) ArrayList rtList = new ArrayList<>(); DateTime beginDate = DateUtil.beginOfYear(DateTime.now()); DateTime endDate = DateUtil.endOfYear(DateTime.now()); long offset = DateUtil.betweenMonth(beginDate, endDate, true); for (int i = 0; i < offset + 1; i++) { rtList.add(DateUtil.format(DateUtil.offsetMonth(beginDate, i), pattern)); } return rtList; } return new ArrayList<>(); } /** * str转换成datetime格式 * * @param str * @return */ public static DateTime parse(String str) { if (Objects.equals(str.length(), 7)) { return DateUtil.parse(str, "yyyy-MM"); } return DateUtil.parse(str); } /** * 是否正确的日期格式:1:yyyy-MM-dd * * @param timeStr * @param type * @return */ public static boolean isValidDateFormat(String timeStr, int type) { if (type == 1) { String datePattern = "\\d{4}-\\d{2}-\\d{2}"; // 编译正则表达式模式 Pattern pattern = Pattern.compile(datePattern); // 创建 Matcher 对象 Matcher matcher = pattern.matcher(timeStr); // 检查是否匹配 if (matcher.matches()) { return true; } else { return false; } } return false; } /** * 获取ISO8601时间,秒级,如2024-04-10T09:57:41+08:00 * * @return */ public static String getISO8601Str(Date date) { String pattern = "YYYY-MM-dd'T'HH:mm:ssZZ"; return DateFormatUtils.format(date, pattern); } /** * 获取ISO8601时间,秒级,如2017-06-14T00:00:00.000+08:00 * * @return */ public static String getISO8601StrWithMs(Date date) { String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"; return DateFormatUtils.format(date, pattern); } /** * 判断时间格式 格式必须为“yyyy-MM-dd HH:mm:ss” * * @param sDate * @return */ public static void checkLegalDate19(String sDate) { int legalLen = 19; if ((sDate == null) || (sDate.length() != legalLen)) { throw new OpenAlertException("时间格式格式必须为yyyy-MM-dd HH:mm:ss"); } DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); try { Date date = formatter.parse(sDate); boolean equals = sDate.equals(formatter.format(date)); if (!equals) { throw new OpenAlertException("时间格式格式必须为yyyy-MM-dd HH:mm:ss"); } } catch (Exception e) { throw new OpenAlertException("时间格式格式必须为yyyy-MM-dd HH:mm:ss"); } } public static Date convertQueryDate(String dateStr, boolean isBegin) { Date date = DateUtil.parse(dateStr); if (dateStr.length() == 10) { if (isBegin) { date = DateUtil.beginOfDay(date); } else { date = DateUtil.endOfDay(date); } } return date; } /** * 合并去重时间段 * * @return */ public static List> getTimePeriodListDumplictcatePeriod(List> periodList) { List> result = new ArrayList<>(); //列表不能为空 if (periodList == null) { return null; } //对数据排序,开始时间从小到大 Collections.sort(periodList, new Comparator>() { @Override public int compare(Map u1, Map u2) { long diff = u1.get("startDate").getTime() - u2.get("startDate").getTime(); if (diff > 0) { return 1; } else if (diff < 0) { return -1; } return 0; //相等为0 } }); for (int i = 0; i < periodList.size() - 1; i++) { int j = i + 1; //判断 i的Endtime 与j 的Begintime 是否有交叉,有交叉,更新 j的Begintime 为i的Begintime, 并移除i if (periodList.get(i).get("endDate").after(periodList.get(j).get("startDate"))) { periodList.get(j).put("startDate", periodList.get(i).get("startDate")); periodList.remove(i); i--; } } result = periodList; return result; } /** * 获取下一个周几,不包含自己 * * @param d * @param i 1对应周一,7对应周日 * @return */ public static Date getNextDayOfWeek(Date d, int i) { LocalDate localDate = LocalDate.parse(DateUtil.formatDate(d)).with(DayOfWeek.of(i)); ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault()); Date from = Date.from(zonedDateTime.toInstant()); if (DateUtil.compare(DateUtil.parseDate(DateUtil.formatDate(d)), from) >= 0) { from = DateUtil.offsetDay(from, 7); } else { from = DateUtil.offsetDay(from, 0); } return from; } /** * 获取上一个周几,包含自己 * * @param d * @param i 1对应周一,7对应周日 * @return */ public static Date getBeforeDayOfWeek(Date d, int i) { LocalDate localDate = LocalDate.parse(DateUtil.formatDate(d)).with(DayOfWeek.of(i)); ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault()); Date from = Date.from(zonedDateTime.toInstant()); if (DateUtil.compare(DateUtil.parseDate(DateUtil.formatDate(d)), from) < 0) { from = DateUtil.offsetDay(from, -7); } else { from = DateUtil.offsetDay(from, 0); } return from; } }