package com.whyc.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; /** * @Description : 时间工具类 * @date 2020/10/15 **/ public class DateUtil { public static SimpleDateFormat YYYY_MM_DD_HH_MM_SS=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static SimpleDateFormat YYYY_MM_DD_HH_MM_SS_UNION=new SimpleDateFormat("yyyyMMddHHmmss"); public static SimpleDateFormat YYYY_MM_DD=new SimpleDateFormat("yyyy-MM-dd"); public static SimpleDateFormat YYYY_MM=new SimpleDateFormat("yyyy-MM"); public static SimpleDateFormat YYYY_MM_TABLE=new SimpleDateFormat("yyyy_MM"); public static int compare(String date1Str,String date2Str) throws ParseException { Date date1 = YYYY_MM_DD_HH_MM_SS.parse(date1Str); Date date2 = YYYY_MM_DD_HH_MM_SS.parse(date2Str); if(date1.compareTo(date2)>0){ return 1; }else if(date1.compareTo(date2) == 0){ return 0; }else{ return -1; } } public static Date getMaxTime(String date1Str,String date2Str,String date3Str) { try { Date date1 = YYYY_MM_DD_HH_MM_SS.parse(date1Str); Date date2 = YYYY_MM_DD_HH_MM_SS.parse(date2Str); Date date3 = YYYY_MM_DD_HH_MM_SS.parse(date3Str); Date maxTime = date1; if (maxTime.compareTo(date2) < 0) { maxTime = date2; } if (maxTime.compareTo(date3) < 0) { maxTime = date3; } return maxTime; }catch (ParseException e){ return null; } } public static List> getMonthTime(Date startTimeDate,Date endTimeDate) throws ParseException { List> timeList = new LinkedList<>(); Calendar startTimeCalendar = Calendar.getInstance(); startTimeCalendar.setTime(startTimeDate); Calendar endTimeCalendar = Calendar.getInstance(); endTimeCalendar.setTime(endTimeDate); //按月份切分时段 int startY = startTimeCalendar.get(Calendar.YEAR); int startM = startTimeCalendar.get(Calendar.MONTH)+1; int endY = endTimeCalendar.get(Calendar.YEAR); int endM = endTimeCalendar.get(Calendar.MONTH)+1; int Y = endY - startY; int len = Y*12+(endM-startM)+1; Calendar dateTemp = Calendar.getInstance(); for (int i = 0; i < len; i++) { List SEList = new LinkedList<>(); //dateTemp.setTime(YYYY_MM_DD_HH_MM_SS.parse(startY+"-"+startM+"-01 00:00:00")); dateTemp.setTime(ThreadLocalUtil.parse(startY+"-"+startM+"-01 00:00:00",1)); Date recordTime,recordTime1; dateTemp.add(Calendar.MONTH,i); recordTime = dateTemp.getTime(); int lastDay = dateTemp.getActualMaximum(Calendar.DAY_OF_MONTH); dateTemp.set(Calendar.DAY_OF_MONTH,lastDay); dateTemp.set(Calendar.HOUR_OF_DAY,23); dateTemp.set(Calendar.MINUTE,59); dateTemp.set(Calendar.SECOND,59); recordTime1 = dateTemp.getTime(); if(i==0){ recordTime = startTimeDate; } if(i==len-1){ recordTime1 = endTimeDate; } SEList.add(recordTime); SEList.add(recordTime1); timeList.add(SEList); } return timeList; } /** * 在分表的情况下使用,按年分表,查询需要切割查询使用 *

* 根据传入的起止时间,按照年切割成不同时间段 * * @param startTime 2021-01-01 10:00:00 * @param endTime 2023-05-01 10:10:10 * @return 示例[2021, 2022, 2023] * 使用方法: * 根据返回的第一个数据,如果存在表,则查询筛选条件为>=输入的起始时间;不存在则弃用输入的起始时间 * 根据返回的最后个数据,如果表存在,则查询筛选条件为<=输入的终止时间;不存在则弃用输入的终止时间 * 返回的非第一最后数据,查询全表 */ public static Map> getYearList(Date startTime,Date endTime) throws ParseException { Map> result = new LinkedHashMap<>(); Calendar startTimeC = Calendar.getInstance(); startTimeC.setTime(startTime); int startYear = startTimeC.get(Calendar.YEAR); Calendar endTimeC = Calendar.getInstance(); endTimeC.setTime(endTime); int endYear = endTimeC.get(Calendar.YEAR); int yearSize = endYear - startYear + 1; for (int i = startYear; i <= endYear; i++) { List dateList = new LinkedList<>(); if(yearSize == 1){ //起止时间没有跨年 dateList.add(startTime); dateList.add(endTime); } else if(i==startYear){ //第一年 dateList.add(startTime); Calendar instance = Calendar.getInstance(); instance.set(Calendar.YEAR,i); instance.set(Calendar.MONTH,instance.getActualMaximum(Calendar.MONTH)); instance.set(Calendar.DAY_OF_MONTH,instance.getActualMaximum(Calendar.DAY_OF_MONTH)); instance.set(Calendar.HOUR_OF_DAY,instance.getActualMaximum(Calendar.HOUR_OF_DAY)); instance.set(Calendar.MINUTE,instance.getActualMaximum(Calendar.MINUTE)); instance.set(Calendar.SECOND,instance.getActualMaximum(Calendar.SECOND)); dateList.add(instance.getTime()); } else if(i== endYear){ //尾年 Calendar instance = Calendar.getInstance(); instance.set(Calendar.YEAR,i); instance.set(Calendar.MONTH,instance.getActualMinimum(Calendar.MONTH)); instance.set(Calendar.DAY_OF_MONTH,instance.getActualMinimum(Calendar.DAY_OF_MONTH)); instance.set(Calendar.HOUR_OF_DAY,instance.getActualMinimum(Calendar.HOUR_OF_DAY)); instance.set(Calendar.MINUTE,instance.getActualMinimum(Calendar.MINUTE)); instance.set(Calendar.SECOND,instance.getActualMinimum(Calendar.SECOND)); dateList.add(instance.getTime()); dateList.add(endTime); }else{ Calendar instance = Calendar.getInstance(); instance.set(Calendar.YEAR,i); instance.set(Calendar.MONTH,instance.getActualMinimum(Calendar.MONTH)); instance.set(Calendar.DAY_OF_MONTH,instance.getActualMinimum(Calendar.DAY_OF_MONTH)); instance.set(Calendar.HOUR_OF_DAY,instance.getActualMinimum(Calendar.HOUR_OF_DAY)); instance.set(Calendar.MINUTE,instance.getActualMinimum(Calendar.MINUTE)); instance.set(Calendar.SECOND,instance.getActualMinimum(Calendar.SECOND)); dateList.add(instance.getTime()); Calendar instance2 = Calendar.getInstance(); instance2.set(Calendar.YEAR,i); instance2.set(Calendar.MONTH,instance2.getActualMaximum(Calendar.MONTH)); instance2.set(Calendar.DAY_OF_MONTH,instance2.getActualMaximum(Calendar.DAY_OF_MONTH)); instance2.set(Calendar.HOUR_OF_DAY,instance2.getActualMaximum(Calendar.HOUR_OF_DAY)); instance2.set(Calendar.MINUTE,instance2.getActualMaximum(Calendar.MINUTE)); instance2.set(Calendar.SECOND,instance2.getActualMaximum(Calendar.SECOND)); dateList.add(instance2.getTime()); } result.put(String.valueOf(i),dateList); } return result; } /** * * 在分表的情况下使用,按月分表,查询需要切割查询使用 * * 根据传入的起止时间,按照月切割成不同时间段 * @param startTimeStr 2022-11-01 10:00:00 * @param endTimeStr 2023-05-01 10:10:10 * @return 示例[2022_12,2023_1,2023_2,2023_3,2023_4,2023_5] TODO 这个返回对象格式 需要根据业务需要进行调整 * 使用方法: * 根据返回的第一个数据,如果存在表,则查询筛选条件为>=输入的起始时间;不存在则弃用输入的起始时间 * 根据返回的最后个数据,如果表存在,则查询筛选条件为<=输入的终止时间;不存在则弃用输入的终止时间 * 返回的非第一最后数据,查询全表 * */ public static List getMonthList(String startTimeStr,String endTimeStr) throws ParseException { Calendar startTimeCalendar = Calendar.getInstance(); //Date startTime = DateUtil.YYYY_MM_DD_HH_MM_SS.parse(startTimeStr); Date startTime = ThreadLocalUtil.parse(startTimeStr,1); startTimeCalendar.setTime(startTime); Calendar endTimeCalendar = Calendar.getInstance(); //Date endTime = DateUtil.YYYY_MM_DD_HH_MM_SS.parse(endTimeStr); Date endTime = ThreadLocalUtil.parse(endTimeStr,1); endTimeCalendar.setTime(endTime); /*String[] startTimeSplit = startTimeStr.split("-"); int startYear = Integer.parseInt(startTimeSplit[0]); int startMonth = Integer.parseInt(startTimeSplit[1]); String[] endTimeSplit = endTimeStr.split("-"); int endYear = Integer.parseInt(endTimeSplit[0]); int endMonth = Integer.parseInt(endTimeSplit[1]);*/ List yearMonthList = new LinkedList<>(); while (!startTimeCalendar.after(endTimeCalendar)){ //起始时间大于终止时间则停止 yearMonthList.add(startTimeCalendar.get(Calendar.YEAR)+"_"+(startTimeCalendar.get(Calendar.MONTH)+1)); startTimeCalendar.add(Calendar.MONTH,1); } return yearMonthList; } /** * 查询使用时,需要处理 默认表查询的问题 * 示例: *

* {2020=[Fri Dec 25 14:12:22 CST 2020, Thu Dec 31 23:59:59 CST 2020]} * {2021=[Fri Jan 01 00:00:00 CST 2021, Fri Dec 31 23:59:59 CST 2021]} * {2022=[Sat Jan 01 00:00:00 CST 2022, Tue Nov 29 09:12:22 CST 2022]} * 或 * {2020=[Fri Dec 25 14:12:22 CST 2020, Thu Dec 31 23:59:59 CST 2020]} * {2021=[Fri Jan 01 00:00:00 CST 2021, Fri Dec 31 23:59:59 CST 2021]} * {2022=[Sat Jan 01 00:00:00 CST 2022, Thu Dec 29 09:12:22 CST 2022]} * {default=[Wed Dec 14 15:27:13 CST 2022, Thu Dec 29 09:12:22 CST 2022]} *

* key为数字,表示年度分表;default为默认表 * @param startTimeDate 起始时间 * @param endTimeDate 终止时间 * @return 需要查询的表及查询时间 * @throws ParseException */ public static Map> getQueryTimeForSubTables(Date startTimeDate,Date endTimeDate) throws ParseException { //根据筛选的时间段,查询出符合要求的各分表记录数 //首先,如果当前时间超过7月,默认表中只有本年度的;如果没超过7月,默认表还存在上一年度的记录 Calendar instance = Calendar.getInstance(); if(endTimeDate.compareTo(instance.getTime())>0){ //校验优化最大查询时间 endTimeDate = instance.getTime(); } int nowYear = instance.get(Calendar.YEAR); instance.add(Calendar.MONTH,-6); int beforeYear = instance.get(Calendar.YEAR); Date beforeYearTime = instance.getTime(); instance.setTime(endTimeDate); int endTimeYear = instance.get(Calendar.YEAR); Calendar startTime = Calendar.getInstance(); startTime.setTime(startTimeDate); Map> yearTimeMap = DateUtil.getYearList(startTimeDate, endTimeDate);; if(nowYear == beforeYear){ //默认表只有本年度的(超过了半年,默认表记录全部只有本年度的,同时会生成了当前年度的分表) //如果查询时间范围包含当前年度,则需要查询默认表 if(startTime.get(Calendar.YEAR) >= nowYear && endTimeYear <= nowYear){ //开始时间设置年度初始时间 Calendar defaultTableStartTime = Calendar.getInstance(); defaultTableStartTime.set(Calendar.YEAR,nowYear); defaultTableStartTime.set(Calendar.MONTH,defaultTableStartTime.getActualMinimum(Calendar.MONTH)); defaultTableStartTime.set(Calendar.DAY_OF_MONTH,defaultTableStartTime.getActualMinimum(Calendar.DAY_OF_MONTH)); defaultTableStartTime.set(Calendar.HOUR_OF_DAY,defaultTableStartTime.getActualMinimum(Calendar.HOUR_OF_DAY)); defaultTableStartTime.set(Calendar.MINUTE,defaultTableStartTime.getActualMinimum(Calendar.MINUTE)); defaultTableStartTime.set(Calendar.SECOND,defaultTableStartTime.getActualMinimum(Calendar.SECOND)); //终止时间设置为当前时间 List defaultDateList = new LinkedList<>(); defaultDateList.add(defaultTableStartTime.getTime()); defaultDateList.add(endTimeDate); yearTimeMap.put("default",defaultDateList); } }else{ //查询时间范围不在当前年度 //默认表中存在上一年度的记录.上一年的最早时间为beforeYearTime-上一年的年末 //判断查询时间范围是否包含默认表中上一年度的时间 if(instance.getTime().compareTo(beforeYearTime)>0){ //查询时间大于默认表中上一年度时间,说明查询记录也包含在默认表中 //起始时间 //终止时间 List defaultDateList = new LinkedList<>(); defaultDateList.add(beforeYearTime); defaultDateList.add(endTimeDate); yearTimeMap.put("default",defaultDateList); } } return yearTimeMap; } /** * 在分表的情况下使用,按年分表,查询需要切割查询使用 时间倒序 *

* 根据传入的起止时间,按照年切割成不同时间段 * * @param startTime 2021-01-01 10:00:00 * @param endTime 2023-05-01 10:10:10 * @return 示例 * 使用方法: * 根据返回的第一个数据,如果存在表,则查询筛选条件为>=输入的起始时间;不存在则弃用输入的起始时间 * 根据返回的最后个数据,如果表存在,则查询筛选条件为<=输入的终止时间;不存在则弃用输入的终止时间 * 返回的非第一最后数据,查询全表 */ public static Map> getYearListDesc(Date startTime,Date endTime) throws ParseException { Map> result = new LinkedHashMap<>(); Calendar startTimeC = Calendar.getInstance(); startTimeC.setTime(startTime); int startYear = startTimeC.get(Calendar.YEAR); Calendar endTimeC = Calendar.getInstance(); endTimeC.setTime(endTime); int endYear = endTimeC.get(Calendar.YEAR); int yearSize = endYear - startYear + 1; for (int i = endYear; i >= startYear; i--) { List dateList = new LinkedList<>(); if(yearSize == 1){ //起止时间没有跨年 dateList.add(startTime); dateList.add(endTime); } else if(i==startYear){ //第一年 dateList.add(startTime); Calendar instance = Calendar.getInstance(); instance.set(Calendar.YEAR,i); instance.set(Calendar.MONTH,instance.getActualMaximum(Calendar.MONTH)); instance.set(Calendar.DAY_OF_MONTH,instance.getActualMaximum(Calendar.DAY_OF_MONTH)); instance.set(Calendar.HOUR_OF_DAY,instance.getActualMaximum(Calendar.HOUR_OF_DAY)); instance.set(Calendar.MINUTE,instance.getActualMaximum(Calendar.MINUTE)); instance.set(Calendar.SECOND,instance.getActualMaximum(Calendar.SECOND)); dateList.add(instance.getTime()); } else if(i== endYear){ //尾年 Calendar instance = Calendar.getInstance(); instance.set(Calendar.YEAR,i); instance.set(Calendar.MONTH,instance.getActualMinimum(Calendar.MONTH)); instance.set(Calendar.DAY_OF_MONTH,instance.getActualMinimum(Calendar.DAY_OF_MONTH)); instance.set(Calendar.HOUR_OF_DAY,instance.getActualMinimum(Calendar.HOUR_OF_DAY)); instance.set(Calendar.MINUTE,instance.getActualMinimum(Calendar.MINUTE)); instance.set(Calendar.SECOND,instance.getActualMinimum(Calendar.SECOND)); dateList.add(instance.getTime()); dateList.add(endTime); }else{ Calendar instance = Calendar.getInstance(); instance.set(Calendar.YEAR,i); instance.set(Calendar.MONTH,instance.getActualMinimum(Calendar.MONTH)); instance.set(Calendar.DAY_OF_MONTH,instance.getActualMinimum(Calendar.DAY_OF_MONTH)); instance.set(Calendar.HOUR_OF_DAY,instance.getActualMinimum(Calendar.HOUR_OF_DAY)); instance.set(Calendar.MINUTE,instance.getActualMinimum(Calendar.MINUTE)); instance.set(Calendar.SECOND,instance.getActualMinimum(Calendar.SECOND)); dateList.add(instance.getTime()); Calendar instance2 = Calendar.getInstance(); instance2.set(Calendar.YEAR,i); instance2.set(Calendar.MONTH,instance2.getActualMaximum(Calendar.MONTH)); instance2.set(Calendar.DAY_OF_MONTH,instance2.getActualMaximum(Calendar.DAY_OF_MONTH)); instance2.set(Calendar.HOUR_OF_DAY,instance2.getActualMaximum(Calendar.HOUR_OF_DAY)); instance2.set(Calendar.MINUTE,instance2.getActualMaximum(Calendar.MINUTE)); instance2.set(Calendar.SECOND,instance2.getActualMaximum(Calendar.SECOND)); dateList.add(instance2.getTime()); } result.put(String.valueOf(i),dateList); } return result; } /** * 在分表的情况下使用,按月分表,查询需要切割查询使用 时间倒序 *

* 根据传入的起止时间,按照年切割成不同时间段 * * @param startTime 2023-01-01 10:00:00 * @param endTime 2023-05-01 10:10:10 * @return 示例 * { * 2023_04=[Fri Dec 25 14:12:22 CST 2020, Thu Dec 31 23:59:59 CST 2020] * 2023_03=[Fri Jan 01 00:00:00 CST 2021, Fri Dec 31 23:59:59 CST 2021], * 2023_02=[Sat Jan 01 00:00:00 CST 2022, Sat Dec 31 23:59:59 CST 2022], * 2023_01=[Sun Jan 01 00:00:00 CST 2023, Tue Jan 24 16:45:22 CST 2023], * * } * 使用方法: * 根据返回的第一个数据,如果存在表,则查询筛选条件为>=输入的起始时间;不存在则弃用输入的起始时间 * 根据返回的最后个数据,如果表存在,则查询筛选条件为<=输入的终止时间;不存在则弃用输入的终止时间 * 返回的非第一最后数据,查询全表 */ public static Map> getMonthListDesc(Date startTime,Date endTime) throws ParseException { Map> result = new LinkedHashMap<>(); Calendar startTimeC = Calendar.getInstance(); startTimeC.setTime(startTime); int startYear = startTimeC.get(Calendar.YEAR); int startMonth = startTimeC.get(Calendar.MONTH); Calendar endTimeC = Calendar.getInstance(); endTimeC.setTime(endTime); int endYear = endTimeC.get(Calendar.YEAR); int endMonth = endTimeC.get(Calendar.MONTH); //相差的月份 int monthCount = endYear*12+endMonth-(startYear*12+startMonth); for (int i = monthCount; i >= 0; i--) { List dateList = new LinkedList<>(); if(monthCount == 0 ){ //起止时间没有跨月 dateList.add(startTime); dateList.add(endTime); } else if(i==0){ //第一月 dateList.add(startTime); Calendar instance = Calendar.getInstance(); instance.setTime(startTime); instance.set(Calendar.DAY_OF_MONTH,instance.getActualMaximum(Calendar.DAY_OF_MONTH)); instance.set(Calendar.HOUR_OF_DAY,instance.getActualMaximum(Calendar.HOUR_OF_DAY)); instance.set(Calendar.MINUTE,instance.getActualMaximum(Calendar.MINUTE)); instance.set(Calendar.SECOND,instance.getActualMaximum(Calendar.SECOND)); dateList.add(instance.getTime()); } else if(i== monthCount){ //尾月 Calendar instance = Calendar.getInstance(); instance.setTime(endTime); instance.set(Calendar.DAY_OF_MONTH,instance.getActualMinimum(Calendar.DAY_OF_MONTH)); instance.set(Calendar.HOUR_OF_DAY,instance.getActualMinimum(Calendar.HOUR_OF_DAY)); instance.set(Calendar.MINUTE,instance.getActualMinimum(Calendar.MINUTE)); instance.set(Calendar.SECOND,instance.getActualMinimum(Calendar.SECOND)); dateList.add(instance.getTime()); dateList.add(endTime); }else{ Calendar instance = Calendar.getInstance(); instance.setTime(startTime); instance.add(Calendar.MONTH,i); instance.set(Calendar.DAY_OF_MONTH,instance.getActualMinimum(Calendar.DAY_OF_MONTH)); instance.set(Calendar.HOUR_OF_DAY,instance.getActualMinimum(Calendar.HOUR_OF_DAY)); instance.set(Calendar.MINUTE,instance.getActualMinimum(Calendar.MINUTE)); instance.set(Calendar.SECOND,instance.getActualMinimum(Calendar.SECOND)); dateList.add(instance.getTime()); Calendar instance2 = Calendar.getInstance(); instance2.setTime(startTime); instance2.add(Calendar.MONTH,i); instance2.set(Calendar.DAY_OF_MONTH,instance2.getActualMaximum(Calendar.DAY_OF_MONTH)); instance2.set(Calendar.HOUR_OF_DAY,instance2.getActualMaximum(Calendar.HOUR_OF_DAY)); instance2.set(Calendar.MINUTE,instance2.getActualMaximum(Calendar.MINUTE)); instance2.set(Calendar.SECOND,instance2.getActualMaximum(Calendar.SECOND)); dateList.add(instance2.getTime()); } //result.put(DateUtil.YYYY_MM_TABLE.format(dateList.get(0)),dateList); result.put(ThreadLocalUtil.format(dateList.get(0),2),dateList); } return result; } /** * 查询使用时,需要处理 默认表查询的问题 倒序 * 示例: *

* {2020=[Fri Dec 25 14:12:22 CST 2020, Thu Dec 31 23:59:59 CST 2020]} * {2021=[Fri Jan 01 00:00:00 CST 2021, Fri Dec 31 23:59:59 CST 2021]} * {2022=[Sat Jan 01 00:00:00 CST 2022, Tue Nov 29 09:12:22 CST 2022]} * 或 * {2020=[Fri Dec 25 14:12:22 CST 2020, Thu Dec 31 23:59:59 CST 2020]} * {2021=[Fri Jan 01 00:00:00 CST 2021, Fri Dec 31 23:59:59 CST 2021]} * {2022=[Sat Jan 01 00:00:00 CST 2022, Thu Dec 29 09:12:22 CST 2022]} * {default=[Wed Dec 14 15:27:13 CST 2022, Thu Dec 29 09:12:22 CST 2022]} *

* key为数字,表示年度分表;default为默认表 * @param startTimeDate 起始时间 * @param endTimeDate 终止时间 * @return 需要查询的表及查询时间 * @throws ParseException */ public static Map> getQueryTimeForSubTablesDesc(Date startTimeDate,Date endTimeDate) throws ParseException { //根据筛选的时间段,查询出符合要求的各分表记录数 //首先,如果当前时间超过7月,默认表中只有本年度的;如果没超过7月,默认表还存在上一年度的记录 Calendar now = Calendar.getInstance(); if(endTimeDate.compareTo(now.getTime())>0){ //校验优化最大查询时间 endTimeDate = now.getTime(); } Calendar timeBefore7Month = Calendar.getInstance(); timeBefore7Month.add(Calendar.MONTH,-7); LinkedHashMap> yearTimeMap = (LinkedHashMap>) DateUtil.getYearListDesc(startTimeDate, endTimeDate); Map> yearTimeDescMap = new LinkedHashMap<>(); boolean existDefaultYear = false; /*if(nowYear == beforeYear){ //默认表只有本年度的(超过了半年,默认表记录全部只有本年度的,同时会生成了当前年度的分表) //如果查询时间范围包含当前年度,则需要查询默认表 if(startTime.get(Calendar.YEAR) >= nowYear && endTimeYear <= nowYear){ //开始时间设置年度初始时间 Calendar defaultTableStartTime = Calendar.getInstance(); defaultTableStartTime.set(Calendar.YEAR,nowYear); defaultTableStartTime.set(Calendar.MONTH,defaultTableStartTime.getActualMinimum(Calendar.MONTH)); defaultTableStartTime.set(Calendar.DAY_OF_MONTH,defaultTableStartTime.getActualMinimum(Calendar.DAY_OF_MONTH)); defaultTableStartTime.set(Calendar.HOUR_OF_DAY,defaultTableStartTime.getActualMinimum(Calendar.HOUR_OF_DAY)); defaultTableStartTime.set(Calendar.MINUTE,defaultTableStartTime.getActualMinimum(Calendar.MINUTE)); defaultTableStartTime.set(Calendar.SECOND,defaultTableStartTime.getActualMinimum(Calendar.SECOND)); //终止时间设置为当前时间 List defaultDateList = new LinkedList<>(); //defaultDateList.add(defaultTableStartTime.getTime()); defaultDateList.add(startTimeDate); defaultDateList.add(endTimeDate); yearTimeMap.put("default",defaultDateList); existDefaultYear = true; } }else{ //查询时间范围不在当前年度 //默认表中存在上一年度的记录.上一年的最早时间为beforeYearTime-上一年的年末 //判断查询时间范围是否包含默认表中上一年度的时间 if(instance.getTime().compareTo(beforeYearTime)>0){ //查询时间大于默认表中上一年度时间,说明查询记录也包含在默认表中 //起始时间 //终止时间 List defaultDateList = new LinkedList<>(); defaultDateList.add(startTimeDate); defaultDateList.add(endTimeDate); yearTimeMap.put("default",defaultDateList); existDefaultYear = true; } }*/ if(startTimeDate.before(now.getTime()) || endTimeDate.after(timeBefore7Month.getTime())){ List defaultDateList = new LinkedList<>(); defaultDateList.add(startTimeDate); defaultDateList.add(endTimeDate); yearTimeMap.put("default",defaultDateList); existDefaultYear = true; } //调整下顺序,将default调整到首位 if(existDefaultYear){ List defaultTimeList = yearTimeMap.get("default"); yearTimeDescMap.put("default",defaultTimeList); } Set yearSet = yearTimeMap.keySet(); for (String year : yearSet) { if(!year.equals("default")){ yearTimeDescMap.put(year,yearTimeMap.get(year)); } } return yearTimeDescMap; } /** * 查询使用时,需要处理 默认表查询的问题 倒序 * 示例: *

* {2020=[Fri Dec 25 14:12:22 CST 2020, Thu Dec 31 23:59:59 CST 2020]} * {2021=[Fri Jan 01 00:00:00 CST 2021, Fri Dec 31 23:59:59 CST 2021]} * {2022=[Sat Jan 01 00:00:00 CST 2022, Tue Nov 29 09:12:22 CST 2022]} * 或 * {2020=[Fri Dec 25 14:12:22 CST 2020, Thu Dec 31 23:59:59 CST 2020]} * {2021=[Fri Jan 01 00:00:00 CST 2021, Fri Dec 31 23:59:59 CST 2021]} * {2022=[Sat Jan 01 00:00:00 CST 2022, Thu Dec 29 09:12:22 CST 2022]} * {default=[Wed Dec 14 15:27:13 CST 2022, Thu Dec 29 09:12:22 CST 2022]} *

* key为数字,表示年度分表;default为默认表 * @param startTimeDate 起始时间 * @param endTimeDate 终止时间 * @return 需要查询的表及查询时间 * @throws ParseException */ public static Map> getQueryTimeForSubTablesDescWithOutDefault(Date startTimeDate,Date endTimeDate) throws ParseException { //根据筛选的时间段,查询出符合要求的各分表记录数 //首先,如果当前时间超过7月,默认表中只有本年度的;如果没超过7月,默认表还存在上一年度的记录 Calendar now = Calendar.getInstance(); if(endTimeDate.compareTo(now.getTime())>0){ //校验优化最大查询时间 endTimeDate = now.getTime(); } Calendar timeBefore7Month = Calendar.getInstance(); timeBefore7Month.add(Calendar.MONTH,-7); LinkedHashMap> yearTimeMap = (LinkedHashMap>) DateUtil.getYearListDesc(startTimeDate, endTimeDate); return yearTimeMap; } /** * 按年划分 * 优化getQueryTimeForSubTablesDesc,待测试 * 更新default表是否查询的逻辑,改||为&& * */ public static Map> getQueryTimeForSubTablesDesc2(Date startTimeDate,Date endTimeDate) throws ParseException { //根据筛选的时间段,查询出符合要求的各分表记录数 //首先,如果当前时间超过7月,默认表中只有本年度的;如果没超过7月,默认表还存在上一年度的记录 Calendar now = Calendar.getInstance(); if(endTimeDate.compareTo(now.getTime())>0){ //校验优化最大查询时间 endTimeDate = now.getTime(); } Calendar timeBefore7Month = Calendar.getInstance(); timeBefore7Month.add(Calendar.MONTH,-7); LinkedHashMap> yearTimeMap = (LinkedHashMap>) DateUtil.getYearListDesc(startTimeDate, endTimeDate); Map> yearTimeDescMap = new LinkedHashMap<>(); boolean existDefaultYear = false; //查询的开始时间 小于现在 //查询的结束时间 大于 七个月前 if(startTimeDate.before(now.getTime()) && endTimeDate.after(timeBefore7Month.getTime())){ List defaultDateList = new LinkedList<>(); defaultDateList.add(startTimeDate); defaultDateList.add(endTimeDate); yearTimeMap.put("default",defaultDateList); existDefaultYear = true; } //调整下顺序,将default调整到首位 if(existDefaultYear){ List defaultTimeList = yearTimeMap.get("default"); yearTimeDescMap.put("default",defaultTimeList); } Set yearSet = yearTimeMap.keySet(); for (String year : yearSet) { if(!year.equals("default")){ yearTimeDescMap.put(year,yearTimeMap.get(year)); } } return yearTimeDescMap; } /** * 按月划分,时间倒序 * 在原来按起止时间获取月份划分集合的基础上,加入实际子表逻辑,当前月内的,在default表 * */ public static Map> getQueryTimeForSubTablesByMonthDesc(Date startTimeDate,Date endTimeDate) throws ParseException { //根据筛选的时间段,查询出符合要求的各分表记录数 //首先,如果当前时间超过7月,默认表中只有本年度的;如果没超过7月,默认表还存在上一年度的记录 Calendar now = Calendar.getInstance(); if(endTimeDate.compareTo(now.getTime())>0){ //校验优化最大查询时间 endTimeDate = now.getTime(); } LinkedHashMap> yearTimeMap = (LinkedHashMap>) DateUtil.getMonthListDesc(startTimeDate, endTimeDate); Map> yearTimeDescMap = new LinkedHashMap<>(); boolean existDefaultYear = false; //查询的结束时间 在当月,则有default表 //同时,抹去月份集合里的当月 //if(DateUtil.YYYY_MM_TABLE.format(endTimeDate).equals(DateUtil.YYYY_MM_TABLE.format(now.getTime()))){ if(ThreadLocalUtil.format(endTimeDate,2).equals(ThreadLocalUtil.format(now.getTime(),2))){ List defaultDateList = new LinkedList<>(); defaultDateList.add(startTimeDate); defaultDateList.add(endTimeDate); yearTimeMap.put("default",defaultDateList); existDefaultYear = true; //yearTimeMap.remove(DateUtil.YYYY_MM_TABLE.format(endTimeDate)); yearTimeMap.remove(ThreadLocalUtil.format(endTimeDate,2)); } //调整下顺序,将default调整到首位 if(existDefaultYear){ List defaultTimeList = yearTimeMap.get("default"); yearTimeDescMap.put("default",defaultTimeList); } Set yearSet = yearTimeMap.keySet(); for (String year : yearSet) { if(!year.equals("default")){ yearTimeDescMap.put(year,yearTimeMap.get(year)); } } return yearTimeDescMap; } public static void main(String[] args) throws ParseException { //Date d1 = YYYY_MM_DD_HH_MM_SS.parse("2023-01-22 14:12:22"); //Date d2 = YYYY_MM_DD_HH_MM_SS.parse("2023-08-24 16:45:22"); //Map> monthListDesc = getQueryTimeForSubTablesByMonthDesc(d1, d2); // //Set>> entries = monthListDesc.entrySet(); //for (Map.Entry> entry : entries) { // System.out.println(entry); //} //Map map = new HashMap<>(); //map.put("2022_01",""); //map.put("2022_02",""); //map.put("2022_10",""); //map.put("2022_12",""); //map.put("2021_03",""); //map.put("2023_01",""); //map.put("2023_05",""); //map.put("2021_10",""); //Set keySet = map.keySet(); //List keySetDesc = keySet.stream().sorted(Comparator.comparing(String::hashCode).reversed()).collect(Collectors.toList()); String t1 = "2024-01-25 12:22:29"; String t2 = "2024-01-25 12:32:24"; String t3 = "2024-01-25 12:42:26"; Date maxTime = getMaxTime(t1, t2, t3); System.out.println(maxTime.toString()); } }