可定义日期表实体类MyDateEntity
public class MyDateEntity{
/**
* 日期;
*/
private String date;
/**
* 是否为节假日期: 1:是节假日 0:不是节假日
*/
private String isHoliday;
public MyDateEntity() {
}
public MyDateEntity(String date, String isHoliday) {
this.date = date;
this.isHoliday = isHoliday;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getIsHoliday() {
return isHoliday;
}
public void setIsHoliday(String isHoliday) {
this.isHoliday = isHoliday;
}
}
对应在数据库创建日期表;my_date表
,只需要两个字段即可;
首先,这个方法getOffsetDay
可以根据输入日期以及偏移量以及格式得到指定日期.
/**
* 取得指定日期
*
* @param dateFrom 指定日期的字符串 [示例:20221022]
* @param dateAmount 日期偏移量; 0 正数 负数都可;示例[0 / 1 / -1]
* @param dateFormat 日期格式 例如: yyyyMMdd [注意:需要和dateFrom格式对应]
*/
public static String getOffsetDay(String dateFrom, int dateAmount, String dateFormat) {
//dateTo 返回的指定日期
String dateTo = null;
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
Calendar cal = Calendar.getInstance();
Date date = null;
try {
date = simpleDateFormat.parse(dateFrom);
cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DAY_OF_MONTH, dateAmount);
} catch (Exception e) {
//异常处理;......
} finally {
dateTo = simpleDateFormat.format(cal.getTime());
}
return dateTo;
}
注意该方法只是得到处理后的偏移日期;
注意在调用方法时; 参数:dayOffset
是外面可控制的,便于灵活使用.
/**
* 1: 先根据偏移量,根据自然日得到指定日期;
* 2: 判断当前得到的日期是否为节假日
* 3: 判断节假日;[isHoliday]---[0:否][1:是]
* 4: 如果是节假日;根据偏移量正负数;若正向递增偏移,则每次按自然日向前推一天;再次判断是否为节假日.
* 5: 如果是节假日;根据偏移量正负数;若负向递减偏移,则每次按自然日向后推一天;再次判断是否为节假日
* 6: 直到不是节假日时;得到的就是需要处理的日期;
*
* @param dayOffset 日期偏移量值 0 正数(例如1) 负数(例如-1)
* @param date 传入的日期
* @author 小智RE0
*/
public static String isHolidayDateDeal(String dayOffset, String date) {
String dateStart = date;
int dateAmount = Integer.parseInt(dayOffset);
//根据偏移量,调整时间日期; 先按照自然日处理偏移日期
String dateDeal = getOffsetDay(dateStart, dateAmount, "yyyyMMdd");
//是否为节假日 1-是节假日; 0:非节假日;
String isHoliday = "1";
while (!"0".equals(isHoliday)) {
//查询 my_date表; 以 dateDeal 作为条件,查询当前日期所存的记录;
MyDateEntity myDateEntity = XXXXXX具体的SQL处理[];
if (myDateEntity != null) {
//判断是否为节假日;
isHoliday = myDateEntity.getIsHoliday();
if ("0".equals(isHoliday)) {
//非节假日,可以退出;
break;
} else if ("1".equals(isHoliday)) {
//节假日;需要再处理日期;
//先记录当前节假日天数;
//偏移天数;
if (dateAmount >= 0) {
//偏移量为date+N;
//若得到的日期一直不是节假日,则进行循环加1个自然日,直至得到非节假日;
dateDeal = getOffsetDay(dateDeal, 1, "yyyyMMdd");
} else {
//偏移量为date-N;
//若得到的日期一直不是节假日,则进行循环减1个自然日,直至得到非节假日;
dateDeal = getOffsetDay(dateDeal, -1, "yyyyMMdd");
}
}
} else {
//避免死循环;
//当然也可以控制 dayOffset 在设置参数时的控制,避免出现[my_date]表找不到当前日期的情况;
//或者保障[my_date]表中维护的日期记录足够多;
break;
}
}
//最终使用的日期
return dateDeal;
}