在项目中遇到增加天数跳过节假日的需求,网上查询各种api之后,决定自己开发一个小demo。
此处记载开发思路。
一、初始化每年的日期,并标记工作日、周末、节假日。这里每年初始化一次,然后手动更改日期的类型(0工作日、1节假日、2周末)。
public boolean doInitThisYearDays(int year) throws BusinessException {
// 今年年度
if (0 == year) year = Integer.parseInt(DateTimeUtil.date2YString(new Date()));
// 循环12个月
for (int i = 1; i <= 12; i++) {
// 月份
String month = i < 10 ? "0" + i : i + "";
// 每月的天数
String lastDay = DateTimeUtil.getMonthLastDay(year, i);
int lastDayInt = Integer.parseInt(lastDay);
for (int j = 1; j <= lastDayInt; j++) {
// 天
String day = j < 10 ? "0" + j : j + "";
HolidayBDayEntity dayEntity = new HolidayBDayEntity();
dayEntity.setDayYear(year + "").setDayMonth(month).setDayDay(day).setDayType("0")
.setDayYm(year + "-" + month).setDayYmd(year + "-" + month + "-" + day)
.setDayTime(DateTimeUtil.parseDate(year + "-" + month + "-" + day)).insert();
// 周
Date dayTime = dayEntity.getDayTime();
// 第几周
int numberWeek = DateTimeUtil.getNumberWeek(dayTime);
// 周几
int weekNumber = DateTimeUtil.getWeekNumber(dayTime);
int weekNum = weekNumber - 1;
if (weekNum == 0) weekNum = 7;
dayEntity.setDayWeek(numberWeek + "").setWeekNum(weekNum + "").updateById();
}
}
return true;
}
二、增加天数跳过周末
public String addDaysSkipWeekend(String ymdDate, int days) throws BusinessException {
Calendar nowTime = Calendar.getInstance();
nowTime.setTime(DateTimeUtil.parseDate(ymdDate));
// 增加天数
for (int i = 0; i < days; i++) {
// 增加天数
nowTime.add(Calendar.DATE, 1);
// 判断日期类型,是否周末
String isWeek = judgeDateIsHoliday(DateTimeUtil.dateFormat2YmdInteger(nowTime.getTime()));
log.info("是否周末==={}", isWeek);
if ("2".equals(isWeek)) {
i--;
}
}
Date nowTimeTime = nowTime.getTime();
return DateTimeUtil.dateFormat2YmdString(nowTimeTime);
}
三、增加天数跳过节假日、周末
public String addDaysSkipHoliday(String ymdDate, int days) throws BusinessException {
Calendar nowTime = Calendar.getInstance();
nowTime.setTime(DateTimeUtil.parseDate(ymdDate));
// 增加天数
for (int i = 0; i < days; i++) {
// 增加天数
nowTime.add(Calendar.DATE, 1);
// 判断日期类型,是否工作日
String isWork = judgeDateIsHoliday(DateTimeUtil.dateFormat2YmdInteger(nowTime.getTime()));
if (!"0".equals(isWork)) {
i--;
}
}
Date nowTimeTime = nowTime.getTime();
return DateTimeUtil.dateFormat2YmdString(nowTimeTime);
}
核心思想:循环需要增加的天数,如果日期类型不等于需要跳过的节假日,则--,再次进入循环。
判断日期类型judgeDateIsHoliday()。
public String judgeDateIsHoliday(String ymdDate) throws BusinessException {
String ymdString = DateTimeUtil.dateFormat2YmdString(DateTimeUtil.parseDate(ymdDate));
HolidayBDayEntity dayEntity = holidayBDayMapper.selectOne(new QueryWrapper<HolidayBDayEntity>().eq("day_ymd", ymdString));
return dayEntity.getDayType();
}