得到指定的偏移日期,遇到节假日就跳过,重新偏移定位日期
Posted 小智RE0
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了得到指定的偏移日期,遇到节假日就跳过,重新偏移定位日期相关的知识,希望对你有一定的参考价值。
- 最近有这样一段处理,需要在指定的日期自动打开某个任务;
- 这个指定日期可根据设置的参数[偏移量]进行控制;
- 但是需要对应真实的节假日,如果是节假日,则不可以去打开那个日期的任务;
- 即遇到节假日需要向前/向后(根据偏移量的实际情况进行判断)推算1天,
- 如此循环直到得到非节假日,返回该日期.
可定义日期表实体类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
是外面可控制的,便于灵活使用.
/**
* <p>1: 先根据偏移量,根据自然日得到指定日期;</p>
* <p>2: 判断当前得到的日期是否为节假日</p>
* <p>3: 判断节假日;[isHoliday]---[0:否][1:是]</p>
* <p>4: 如果是节假日;根据偏移量正负数;若正向递增偏移,则每次按自然日向前推一天;再次判断是否为节假日.</p>
* <p>5: 如果是节假日;根据偏移量正负数;若负向递减偏移,则每次按自然日向后推一天;再次判断是否为节假日</p>
* <p>6: 直到不是节假日时;得到的就是需要处理的日期;</p>
*
* @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;
以上是关于得到指定的偏移日期,遇到节假日就跳过,重新偏移定位日期的主要内容,如果未能解决你的问题,请参考以下文章