Java获取当前时间后几天工作日日期

package test.date;

import com.google.common.collect.Lists;
import org.apache.http.client.utils.DateUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * Created by tianxiang on 2020/10/14
 */
public class HolidayUtils {
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    /**
     * 获取计划激活日期
     * @param today opening date
     * @param holidayList holidayList
     * @param num num个工作日后
     * @return
     * @throws ParseException
     */
    public static Date getScheduleActiveDate(Date today, List<String> holidayList, List<String> extraWorkdayList, int num) throws ParseException {
        int delay = 1;
        while(delay <= num){
            Date tomorrow = getTomorrow(today);
            String tomorrowStr = sdf.format(tomorrow);
            //当前日期+1,判断是否是节假日,不是的同时要判断是否是周末,都不是则scheduleActiveDate日期+1
            if((!isWeekend(tomorrowStr) && !isHoliday(tomorrowStr,holidayList))
                    || isExtraWorkdays(tomorrowStr,extraWorkdayList)){
                delay++;
                today = tomorrow;
            } else if (isWeekend(tomorrowStr)){
                today = tomorrow;
            } else if (isHoliday(tomorrowStr,holidayList)){
                today = tomorrow;
            }
        }

        return today;
    }

    /**
     * 获取tomorrow的日期
     *
     * @param date
     * @return
     */
    public static Date getTomorrow(Date date){
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DAY_OF_MONTH, +1);
        date = calendar.getTime();
        return date;
    }

    /**
     * 判断是否是weekend
     *
     * @param sdate
     * @return
     * @throws ParseException
     */
    public static boolean isWeekend(String sdate) throws ParseException {
        Date date = sdf.parse(sdate);
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        if(cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY){
            return true;
        } else{
            return false;
        }

    }

    /**
     * 判断是否是holiday
     *
     * @param sdate
     * @param list
     * @return
     * @throws ParseException
     */
    public static boolean isHoliday(String sdate, List<String> list) throws ParseException {
        if(list.size() > 0){
            for(int i = 0; i < list.size(); i++){
                if(sdate.equals(list.get(i))){
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 判断是否是由于放假需要额外工作的周末
     *
     * @param sdate
     * @param list
     * @return
     * @throws ParseException
     */
    public static boolean isExtraWorkdays(String sdate, List<String> list) throws ParseException {
        if(list.size() > 0){
            for(int i = 0; i < list.size(); i++){
                if(sdate.equals(list.get(i))){
                    return true;
                }
            }
        }
        return false;
    }

    public static void main(String[] args)throws Exception {
        // 法定节假日(需要定时入库再读库,政府每年都会在12月份左右公布,无法提前预知)
        List holidayList = Lists.newArrayList();
        holidayList.add("2020-10-01");
        holidayList.add("2020-10-02");
        holidayList.add("2020-10-03");
        holidayList.add("2020-10-04");
        holidayList.add("2020-10-05");
        holidayList.add("2020-10-06");
        holidayList.add("2020-10-07");

        // 额外工作日(需要补班的日期)
        List extraWorkdayList = Lists.newArrayList();
        extraWorkdayList.add("2020-10-10");

        String[] dateFormats = new String[1];
        dateFormats[0] = "yyyy-MM-dd";
        Date date = DateUtils.parseDate("2020-10-09", dateFormats);
        System.out.println(HolidayUtils.getScheduleActiveDate(date, holidayList,extraWorkdayList, 2));
    }
}

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值