java获取n个工作日后的日期, 排除周末和节假日(顺延)

本文介绍了如何在Java中计算排除周末和法定节假日的n个工作日后的日期,详细阐述了需求分析、实现思路,并提供了测试代码和实际应用的说明。
摘要由CSDN通过智能技术生成

java获取n个工作日后的日期, 排除周末和节假日(顺延)

一.需求分析
需求描述
思路解析
二.以下为测试代码(测试时日期为2018-08-28)
三.应用
1.首先看一下我数据库中存放的holiday, 每一个节日都是一个范围(有开始日期和结束日期)
2.从数据库中查询holiday结果集, 遍历结果集将每一天holiday存到holidayList中
3.调用HolidayUtils中的getScheduleActiveDate传入正确的参数, 返回值即是排除节假日和周末后的指定n个工作日后的日期.(HolidayUtils如下)
代码备份
HolidayUtils.java
PersDateUtils.java
使用说明

一.需求分析
需求描述
  工作需要获取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)){
   
                delay++;
                today = tomorrow
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值