package com.whyc.util;
|
|
import java.text.ParseException;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
|
/**
|
* 日期处理工具类
|
* @Author xuzhongpei
|
* @Date 2023-11-16
|
* */
|
public class DateUtil {
|
|
/**ThreadLocal副本形式避免多线程中 数据安全问题*/
|
private static ThreadLocal<SimpleDateFormat> YYYY_MM_DD_HH_MM_SS = ThreadLocal.withInitial(()->new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"));
|
private static ThreadLocal<SimpleDateFormat> YYYY_MM_DD_HH_MM_SS2 = ThreadLocal.withInitial(()->new SimpleDateFormat("yyyy-MM-dd_HH_mm_ss"));
|
private static ThreadLocal<SimpleDateFormat> YYYY_MM_DD_HH_MM_SS_UNION = ThreadLocal.withInitial(()->new SimpleDateFormat("yyyyMMddHHmmss"));
|
private static ThreadLocal<SimpleDateFormat> YYYY_MM_DD = ThreadLocal.withInitial(()->new SimpleDateFormat("yyyy-MM-dd"));
|
private static ThreadLocal<SimpleDateFormat> YYYY_MM_DD_UNION = ThreadLocal.withInitial(()->new SimpleDateFormat("yyyyMMdd"));
|
|
public static String format_YYYY_MM_DD_HH_MM_SS(Date date){
|
return YYYY_MM_DD_HH_MM_SS.get().format(date);
|
}
|
|
public static String format_YYYY_MM_DD_HH_MM_SS2(Date date){
|
return YYYY_MM_DD_HH_MM_SS2.get().format(date);
|
}
|
|
public static String format_YYYY_MM_DD_HH_MM_SS_UNION(Date date){
|
return YYYY_MM_DD_HH_MM_SS_UNION.get().format(date);
|
}
|
|
public static String YYYY_MM_DD(Date date){
|
return YYYY_MM_DD.get().format(date);
|
}
|
|
public static String format_YYYY_MM_DD_UNION(Date date){
|
return YYYY_MM_DD_UNION.get().format(date);
|
}
|
|
|
//获取指定年月的天数
|
public static int getDaysByYearMonth(int year, int month) {
|
|
Calendar a = Calendar.getInstance();
|
a.set(Calendar.YEAR, year);
|
a.set(Calendar.MONTH, month - 1);
|
a.set(Calendar.DATE, 1);
|
a.roll(Calendar.DATE, -1);
|
int maxDate = a.get(Calendar.DATE);
|
return maxDate;
|
}
|
|
//获取某年某月的起始和结束时间
|
//需要注意的是:月份是从0开始的,比如说如果输入5的话,实际上显示的是4月份的最后一天,千万不要搞错了哦
|
public static String getLastDayOfMonth(int year, int month) {
|
Calendar cal = Calendar.getInstance();
|
cal.set(Calendar.YEAR, year);
|
cal.set(Calendar.MONTH, month);
|
cal.set(Calendar.DAY_OF_MONTH,cal.getActualMaximum(Calendar.DATE));
|
return new SimpleDateFormat( "yyyy-MM-dd ").format(cal.getTime())+"23:59:59";
|
}
|
|
public static String getFirstDayOfMonth(int year, int month) {
|
Calendar cal = Calendar.getInstance();
|
cal.set(Calendar.YEAR, year);
|
cal.set(Calendar.MONTH, month);
|
cal.set(Calendar.DAY_OF_MONTH,cal.getMinimum(Calendar.DATE));
|
return new SimpleDateFormat( "yyyy-MM-dd ").format(cal.getTime())+"00:00:00";
|
}
|
//获取当前时间的年份
|
public static int getNowYear(){
|
Calendar ca = Calendar.getInstance();//得到一个Calendar的实例
|
ca.setTime(new Date()); //设置时间为当前时间
|
int year = ca.get(Calendar.YEAR);
|
//System.out.println(month);
|
return year;
|
}
|
//获取当前时间的月份
|
public static int getNowMonth(){
|
Calendar ca = Calendar.getInstance();//得到一个Calendar的实例
|
ca.setTime(new Date()); //设置时间为当前时间
|
int month = ca.get(Calendar.MONTH) + 1;
|
//System.out.println(month);
|
return month;
|
}
|
//获取当前时间的日期
|
public static int getNowDay(){
|
Calendar ca = Calendar.getInstance();//得到一个Calendar的实例
|
ca.setTime(new Date()); //设置时间为当前时间
|
int day = ca.get(Calendar.DAY_OF_MONTH);
|
//System.out.println(month);
|
return day;
|
}
|
//当前时间加上x小时
|
public static String getDateAdd(int minute){
|
Date date = new Date();
|
Calendar c = Calendar.getInstance();
|
c.setTime(date);
|
c.add(Calendar.MINUTE, minute);
|
return new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss").format(c.getTime());
|
}
|
|
//获取时间的年份
|
public static int getDateYear(Date date){
|
Calendar ca = Calendar.getInstance();//得到一个Calendar的实例
|
ca.setTime(date); //设置时间为当前时间
|
int year = ca.get(Calendar.YEAR);
|
//System.out.println(month);
|
return year;
|
}
|
//获取时间的月份
|
public static int getDateMonth(Date date){
|
Calendar ca = Calendar.getInstance();//得到一个Calendar的实例
|
ca.setTime(date); //设置时间为当前时间
|
int month = ca.get(Calendar.MONTH) + 1;
|
//System.out.println(month);
|
return month;
|
}
|
//获取时间的日期
|
public static int getDateDay(Date date){
|
Calendar ca = Calendar.getInstance();//得到一个Calendar的实例
|
ca.setTime(date); //设置时间为当前时间
|
int day = ca.get(Calendar.DAY_OF_MONTH);
|
//System.out.println(month);
|
return day;
|
}
|
//当前时间加上x小时
|
public static Date getDateAdd(Date date,int minute){
|
Calendar c = Calendar.getInstance();
|
c.setTime(date);
|
c.add(Calendar.MINUTE, minute);
|
return c.getTime();
|
}
|
|
/*==========时间切割,按年==========*/
|
/**
|
* 在分表的情况下使用,按年分表,查询需要切割查询使用 时间倒序
|
* <p>
|
* 根据传入的起止时间,按照年切割成不同时间段
|
*
|
* @param startTime 2021-01-01 10:00:00
|
* @param endTime 2023-05-01 10:10:10
|
* @return 示例
|
* 使用方法:
|
* 根据返回的第一个数据,如果存在表,则查询筛选条件为>=输入的起始时间;不存在则弃用输入的起始时间
|
* 根据返回的最后个数据,如果表存在,则查询筛选条件为<=输入的终止时间;不存在则弃用输入的终止时间
|
* 返回的非第一最后数据,查询全表
|
*/
|
public static Map<String, List<Date>> getYearListDesc(Date startTime, Date endTime) throws ParseException {
|
Map<String,List<Date>> 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<Date> 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;
|
}
|
|
/**
|
* 查询使用时,需要处理 默认表查询的问题 倒序
|
* 示例:
|
* <p>
|
* {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]}
|
* </p>
|
* key为数字,表示年度分表;default为默认表
|
* @param startTimeDate 起始时间
|
* @param endTimeDate 终止时间
|
* @return 需要查询的表及查询时间
|
* @throws ParseException
|
*/
|
public static Map<String,List<Date>> 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<String,List<Date>> yearTimeMap = (LinkedHashMap<String, List<Date>>) DateUtil.getYearListDesc(startTimeDate, endTimeDate);
|
Map<String,List<Date>> yearTimeDescMap = new LinkedHashMap<>();
|
boolean existDefaultYear = false;
|
if(startTimeDate.before(now.getTime()) || endTimeDate.after(timeBefore7Month.getTime())){
|
List<Date> defaultDateList = new LinkedList<>();
|
defaultDateList.add(startTimeDate);
|
defaultDateList.add(endTimeDate);
|
|
yearTimeMap.put("default",defaultDateList);
|
existDefaultYear = true;
|
}
|
//调整下顺序,将default调整到首位
|
if(existDefaultYear){
|
List<Date> defaultTimeList = yearTimeMap.get("default");
|
yearTimeDescMap.put("default",defaultTimeList);
|
}
|
Set<String> yearSet = yearTimeMap.keySet();
|
for (String year : yearSet) {
|
if(!year.equals("default")){
|
yearTimeDescMap.put(year,yearTimeMap.get(year));
|
}
|
}
|
|
return yearTimeDescMap;
|
}
|
|
|
}
|