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 List<List<Date>> getMonthTime(Date startTimeDate,Date endTimeDate) throws ParseException {
|
List<List<Date>> 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<Date> SEList = new LinkedList<>();
|
dateTemp.setTime(YYYY_MM_DD_HH_MM_SS.parse(startY+"-"+startM+"-01 00:00:00"));
|
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;
|
}
|
|
/**
|
* 在分表的情况下使用,按年分表,查询需要切割查询使用
|
* <p>
|
* 根据传入的起止时间,按照年切割成不同时间段
|
*
|
* @param startTimeStr 2021-01-01 10:00:00
|
* @param endTimeStr 2023-05-01 10:10:10
|
* @return 示例[2021, 2022, 2023]
|
* 使用方法:
|
* 根据返回的第一个数据,如果存在表,则查询筛选条件为>=输入的起始时间;不存在则弃用输入的起始时间
|
* 根据返回的最后个数据,如果表存在,则查询筛选条件为<=输入的终止时间;不存在则弃用输入的终止时间
|
* 返回的非第一最后数据,查询全表
|
*/
|
public static List<Integer> getYearList(String startTimeStr,String endTimeStr) throws ParseException {
|
Integer startYear = Integer.valueOf(startTimeStr.split("-")[0]);
|
Integer endYear = Integer.valueOf(endTimeStr.split("-")[0]);
|
List<Integer> yearList = new LinkedList<>();
|
while (startYear<=endYear){
|
yearList.add(startYear);
|
startYear++;
|
}
|
return yearList;
|
}
|
|
/**
|
*
|
* 在分表的情况下使用,按月分表,查询需要切割查询使用
|
*
|
* 根据传入的起止时间,按照月切割成不同时间段
|
* @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<String> getMonthList(String startTimeStr,String endTimeStr) throws ParseException {
|
Calendar startTimeCalendar = Calendar.getInstance();
|
Date startTime = DateUtil.YYYY_MM_DD_HH_MM_SS.parse(startTimeStr);
|
startTimeCalendar.setTime(startTime);
|
|
Calendar endTimeCalendar = Calendar.getInstance();
|
Date endTime = DateUtil.YYYY_MM_DD_HH_MM_SS.parse(endTimeStr);
|
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<String> 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;
|
}
|
public static List<List<Date>> 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);
|
List<List<Date>> monthTime;
|
if(nowYear == beforeYear){ //默认表只有本年度的
|
monthTime = DateUtil.getMonthTime(startTimeDate, endTimeDate);
|
//如果查询时间范围包含当前年度,则需要查询默认表
|
if(startTimeDate.getYear() >= nowYear && endTimeDate.getYear()<= nowYear){
|
//表
|
//monthTime.add();
|
}
|
|
}else{ //默认表中存在上一年度的记录.上一年的最早时间为beforeYearTime
|
//判断查询时间范围是否包含默认表中上一年度的时间
|
if(instance.getTime().compareTo(beforeYearTime)>0){ //查询时间大于默认表中上一年度时间,说明查询记录也包含在默认表中
|
|
}
|
//如果查询的范围,
|
monthTime = DateUtil.getMonthTime(startTimeDate, endTimeDate);
|
}
|
|
return null;
|
}
|
|
public static void main(String[] args) throws ParseException {
|
Date d1 = YYYY_MM_DD_HH_MM_SS.parse("2020-12-25 14:12:22");
|
Date d2 = YYYY_MM_DD_HH_MM_SS.parse("2022-01-10 09:12:22");
|
List<List<Date>> monthTime = getMonthTime(d1, d2);
|
System.out.println(monthTime);
|
/*String dateStr = "2023-07-01 00:00:01";
|
Date date = YYYY_MM_DD_HH_MM_SS.parse(dateStr);
|
Calendar instance = Calendar.getInstance();
|
instance.setTime(date);
|
instance.add(Calendar.MONTH,-6);
|
System.out.println(YYYY_MM_DD_HH_MM_SS.format(instance.getTime()));*/
|
}
|
|
}
|