一.说在前面
需求:
工作需要获取n个工作日后的日期, 需要排除weekend和holiday, holiday存在数据库中, 存入的形式是一个节日有起始日期和截止日期(以下文中有关于节假日的表截图).
思路:
大致为: 根据指定日期获取它tomorrow的日期, 判断tomorrow是否是周末和节假日, 如果不是则将tomorrow赋给today继续循环, 循环n次, 返回的today即是目标结果.
1.查询数据库中的holiday, 存入list(需要注意的是, holiday记录里startTime和endTime颠倒的脏数据要剔除, startTime在endTime后面的记录显然是脏数据)
2.判断today是否是周末
3.判断today是否是节假日
4.获取tomorrow的日期, 判断是否是weekend和holiday, 如果不是则将tomorrow赋给today继续循环, 循环n次, 返回today
(这里的today是指指定日期. 如:获取今天以后第10个工作日的日期 今天的日期就是指定日期).
工具类如何使用?
使用方法见博文末尾说明.
二.以下为测试代码(测试时日期为2018-08-28):
package dong.test; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; /** * Created by liangyadong on 2018/8/28 0028. */ public class HolidayTest { private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); public static void main(String[] args) throws ParseException { //查询数据库中holiday,遍历存入list(表中每条记录存放的是假期的起止日期,遍历每条结果,并将其中的每一天都存入holiday的list中),以下为模拟假期 List holidayList = new ArrayList(); holidayList.add("2018-08-29"); holidayList.add("2018-08-30"); holidayList.add("2018-10-01"); holidayList.add("2018-10-02"); holidayList.add("2018-10-03"); holidayList.add("2018-10-04"); holidayList.add("2018-10-05"); holidayList.add("2018-10-06"); holidayList.add("2018-10-07"); //获取计划激活日期 Date scheduleActiveDate = getScheduleActiveDate(holidayList); System.out.println("10个工作日后,即计划激活日期为::" + sdf.format(scheduleActiveDate)); } //获取计划激活日期 public static Date getScheduleActiveDate(List<String> list) throws ParseException { // java.sql.Date currentDate = new java.sql.Date(System.currentTimeMillis());//获取当前日期2018-08-26 Date today = new Date();//Mon Aug 27 00:09:29 CST 2018 Date tomorrow = null; int delay = 1; int num = 10;//根据需要设置,这个值就是业务需要的n个工作日 while(delay <= num){ tomorrow = getTomorrow(today); //当前日期+1即tomorrow,判断是否是节假日,同时要判断是否是周末,都不是则将scheduleActiveDate日期+1,直到循环num次即可 if(!isWeekend(sdf.format(tomorrow)) && !isHoliday(sdf.format(tomorrow),list)){