获取指定N个工作日后的日期

工作中遇到的一个小问题,需要获取指定天数的工作日后的日期,比如:3个工作日后的日期。

从网上没有找到完全符合要求的例子,只好自己写一个,在这里记录一下。

package com.linkcld.ecms.common.util;

import java.text.*;
import java.util.*;

/**
 * 获取指定数量个工作日后的日期。
 * 如:获取20个工作日后的日期。
 * 
 * @author Administrator
 *
 */
public class GetWorkDaysByNumber {

    // 定义当年的节假日日期数组
    private static String[] holidays = { "2018-01-01", "2018-02-15", "2018-02-16", "2018-02-17", "2018-02-18", "2018-02-19", "2018-02-20", "2018-02-21", "2018-04-05", "2018-04-06", "2018-04-07", "2018-04-29", "2018-04-30", "2018-05-01", "2018-06-16", "2018-06-17", "2018-06-18", "2018-09-22", "2018-09-23", "2018-09-24", "2018-10-01", "2018-10-02", "2018-10-03", "2018-10-04", "2018-10-05", "2018-10-06", "2018-10-07" };

    // 调休上班的周末日期数组
    private static String[] workWeekends = { "2018-02-11", "2018-02-24", "2018-04-08", "2018-04-28", "2018-09-29", "2018-09-30", };

    public static void main(String[] args) {
        getDate(15);
    }

    public static Date getDate(int daysNum) {
        List<String> holidaysList = Arrays.asList(holidays);
        List<String> workWeekendsList = Arrays.asList(workWeekends);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.setTime(new Date());
        int num = 0;
        while (num != daysNum) {
            cal.add(Calendar.DAY_OF_YEAR, 1);
            String dateStr = sdf.format(cal.getTime());
            if (holidaysList.contains(dateStr)) { // 是节假日
                continue; // 结束当前循环
            } else if (isWeekend(cal)) { // 是周末
                if (workWeekendsList.contains(dateStr)) { // 是补班的周末
                    num++;
                }
            } else {
                num++;
            }
        }
        // System.out.println("结果:" + sdf.format(cal.getTime()));
        return cal.getTime();
    }

    // 判断是不是周末
    public static boolean isWeekend(Calendar cal) {
        if (cal != null) {
            if ((cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) || (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)) {
                return true;
            }
        }
        return false;
    }

}

思路说一下:

    先获取当年的法定节假日的日期数组(这个在网上随便找,有很多)和需要补班的周末日期数组,指定一个数量值N,即需要多少个工作日后的日期,然后使用循环来进行统计。从当前时间开始,遍历以后的每一天,若日期属于节假日,则不算;若是补班的周日,则算入工作日,直到N个工作日后,查看那天的日期即可。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值