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

public class WeekdaysUtils {
public static List<String> list = new ArrayList<>();//节假日数据源
public static List<String> weekDayList = new ArrayList<>();//补班数据源

static {
//数据源需扩充,每年更新
/**
* 2021年假期及补办数据源
*/
list.add("2021-01-01");
list.add("2021-01-02");
list.add("2021-01-03");
list.add("2021-02-11");
list.add("2021-02-12");
list.add("2021-02-13");
list.add("2021-02-14");
list.add("2021-02-15");
list.add("2021-02-16");
list.add("2021-02-17");
list.add("2021-04-03");
list.add("2021-04-04");
list.add("2021-04-05");
list.add("2021-05-01");
list.add("2021-05-02");
list.add("2021-05-03");
list.add("2021-05-04");
list.add("2021-05-05");
list.add("2021-06-12");
list.add("2021-06-13");
list.add("2021-06-14");
list.add("2021-09-19");
list.add("2021-09-20");
list.add("2021-09-21");
list.add("2021-10-01");
list.add("2021-10-02");
list.add("2021-10-03");
list.add("2021-10-04");
list.add("2021-10-05");
list.add("2021-10-06");
list.add("2021-10-07");
weekDayList.add("2021-02-07");
weekDayList.add("2021-02-20");
weekDayList.add("2021-04-25");
weekDayList.add("2021-05-08");
weekDayList.add("2021-09-18");
weekDayList.add("2021-09-26");
weekDayList.add("2021-10-09");
/**
* 2022年假期及补办数据源
*/
//元旦节
list.add("2022-01-01");
list.add("2022-01-02");
list.add("2022-01-03");
//除夕
list.add("2022-01-31");
//春节
list.add("2022-02-01");
list.add("2022-02-02");
list.add("2022-02-03");
list.add("2022-02-04");
list.add("2022-02-05");
list.add("2022-02-06");
//清明节
list.add("2022-04-03");
list.add("2022-04-04");
list.add("2022-04-05");
//劳动节
list.add("2022-05-01");
list.add("2022-05-02");
list.add("2022-05-03");
list.add("2022-05-04");
//端午节
list.add("2022-06-03");
list.add("2022-06-04");
list.add("2022-06-05");
//国庆节
list.add("2022-10-01");
list.add("2022-10-02");
list.add("2022-10-03");
list.add("2022-10-04");
list.add("2022-10-05");
list.add("2022-10-06");
list.add("2022-10-07");
weekDayList.add("2022-01-29");
weekDayList.add("2022-01-30");
weekDayList.add("2022-04-02");
weekDayList.add("2022-04-24");
weekDayList.add("2022-05-07");
weekDayList.add("2022-10-08");
weekDayList.add("2022-10-09");
/**
* 2023年假期及补办数据源
*/
//元旦节
list.add("2022-12-31");
list.add("2023-01-01");
list.add("2023-01-02");
//除夕
list.add("2023-01-21");
//春节
list.add("2023-01-22");
list.add("2023-01-23");
list.add("2023-01-24");
list.add("2023-01-25");
list.add("2023-01-26");
list.add("2023-01-27");
//清明节
list.add("2023-04-05");
//劳动节
list.add("2023-04-29");
list.add("2023-04-30");
list.add("2023-05-01");
list.add("2023-05-02");
list.add("2023-05-03");
//端午节
list.add("2023-06-22");
list.add("2023-06-23");
list.add("2023-06-24");
//国庆节
list.add("2023-09-29");
list.add("2023-09-30");
list.add("2023-10-01");
list.add("2023-10-02");
list.add("2023-10-03");
list.add("2023-10-04");
list.add("2023-10-05");
list.add("2023-10-06");
weekDayList.add("2023-01-28");
weekDayList.add("2023-01-29");
weekDayList.add("2023-04-23");
weekDayList.add("2023-05-06");
weekDayList.add("2023-06-25");
weekDayList.add("2023-10-07");
weekDayList.add("2023-10-08");
}

private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

/**
* 用于判断n个工作日(排除节假日、周六日包含节后补班数据)后的日期
*
* @param list 节假日数据源
* @param weekDayList 节后补班数据源
* @param today 计算开始时间
* @param num 多少个工作日 根据需要自行安排
* @throws ParseException
*/
public static Date getScheduleActiveDate(List<String> list, List<String> weekDayList, Date today, int num) {
try {
String today1 = WeekdaysUtils.parseDate(today, "yyyy-MM-dd");
Date tomorrow = null;
int delay = 1;
while (delay <= num) {
tomorrow = getTomorrow(today);
//当前日期+1即tomorrow,判断是否是节假日,同时要判断是否是周末,都不是则将scheduleActiveDate日期+1,直到循环num次即可------不是节假日不是周末并且不是补班
if ((!isWeekend(sdf.format(tomorrow)) && !isHoliday(sdf.format(tomorrow), list)) || isWorkWeekDay(sdf.format(tomorrow), weekDayList)) {
if (isWorkWeekDay(sdf.format(tomorrow), weekDayList)) {
System.out.println(sdf.format(tomorrow) + "::是节假日调休补班");
} else {
System.out.println(sdf.format(tomorrow) + "::是正常工作日");
}
delay++;
today = tomorrow;
} else if (isHoliday(sdf.format(tomorrow), list)) {
// tomorrow = getTomorrow(tomorrow);
today = tomorrow;
System.out.println(sdf.format(tomorrow) + "::是节假日");
} else if (isWeekend(sdf.format(tomorrow))) {//是周六日并且不是节后补班
if (!isWorkWeekDay(sdf.format(tomorrow), weekDayList)) {
today = tomorrow;
System.out.println(sdf.format(tomorrow) + "::是休息日");
}
}
}
System.out.println(today1 + "后" + num + "个工作日后,日期为::" + sdf.format(today));
return today;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

/**
* 获取明天的日期
*
* @author Herbert
*/
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
*/
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
*/
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;
}

/**
* 判断是否是补班
*/
public static boolean isWorkWeekDay(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 String parseDate(Date date, String format) {
SimpleDateFormat formater = new SimpleDateFormat(format);
String dateString;
dateString = formater.format(date);
return dateString;
}

/**
* (differ / dayM) 这里拿到被舍弃的整数,整数是几,就代表相隔几天,一天24小时,那就整数乘以24即可。
*
* @param endDate
* @param nowDate
* @return
*/
public static String getDatePoor(Date endDate, Date nowDate) {
long nd = 1000 * 24 * 60 * 60;//每天毫秒数
long nh = 1000 * 60 * 60;//每小时毫秒数
long nm = 1000 * 60;//每分钟毫秒数
long diff = endDate.getTime() - nowDate.getTime(); // 获得两个时间的毫秒时间差异
long day = diff / nd; // 计算差多少天
long hour = diff % nd / nh; // 计算差多少小时
long min = diff % nd % nh / nm; // 计算差多少分钟
return hour + "小时" + min + "分钟";
}

/**
* 查询两个时间之间有多少个工作日
*
* @param list 节假日数据源
* @param weekDayList 节后补班数据源
* @param endDate 结束时间
* @param nowDate 开始时间
* @return
*/
public static Map<String, Integer> getDateWeekdayNum(List<String> list, List<String> weekDayList, Date endDate, Date nowDate) {
Map<String, Integer> resultMap = new HashMap<>();
try {
String endDateStr = WeekdaysUtils.parseDate(endDate, "yyyy-MM-dd");
String nowDateStr = WeekdaysUtils.parseDate(nowDate, "yyyy-MM-dd");
//相等则是同一天
if (endDateStr.equals(nowDateStr)) {
resultMap.put("weekday", 0);
resultMap.put("holiday", 0);
return resultMap;
}
Date tomorrow = null;
int weekday = 0;
int holiday = 0;
while (true) {
// + 1
tomorrow = getTomorrow(nowDate);
String str = sdf.format(tomorrow);
//当前日期+1即tomorrow,判断是否是节假日,同时要判断是否是周末,都不是则将scheduleActiveDate日期+1,直到循环num次即可------不是节假日不是周末并且不是补班
if ((!isWeekend(sdf.format(tomorrow)) && !isHoliday(sdf.format(tomorrow), list)) || isWorkWeekDay(sdf.format(tomorrow), weekDayList)) {
if (isWorkWeekDay(sdf.format(tomorrow), weekDayList)) {
System.out.println(sdf.format(tomorrow) + "::是节假日调休补班");
} else {
System.out.println(sdf.format(tomorrow) + "::是正常工作日");
}
//工作日/调班
++weekday;
nowDate = tomorrow;
} else {
//休假日
++holiday;
nowDate = tomorrow;
}
if (endDateStr.equals(sdf.format(tomorrow))) {
break;
}
}
resultMap.put("weekday", weekday);
resultMap.put("holiday", holiday);
return resultMap;
} catch (Exception e) {
e.printStackTrace();
}
return resultMap;
}
}

获取指定n个工作日后的日期工具类的更多相关文章

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

    一.写在前面 需求: 工作需要获取n个工作日后的日期, 需要排除weekend和holiday, holiday存在数据库中, 存入的形式是一个节日有起始日期和截止日期(以下文中有关于节假日的表截图) ...

  2. Java获取上周,本周,本月,本年,开始结束时间 。日期工具类

    由于获取日期经常会使用到,所有我自己写了一个工具类 1.基本上能用上的都写出来了,包括:1)获取当天的开始时间 2)获取当天的结束时间 3)获取昨天的开始时间 4)获取昨天的结束时间 5)获取明天的开 ...

  3. 日期工具类 - DateUtil.java

    日期工具类,提供对日期的格式化和转换方法.获取区间日期.指定日期.每月最后一天等. 源码如下:(点击下载 -DateUtil.java.commons-lang-2.6.jar ) import ja ...

  4. JS 日期工具类-基于yDate

    源码下载 前言:最近在用到JS日期操作时,发现有一些不方便,于是搜素了一些网上的资料,基于一个开源工具类-yDate 进行了个性化定制,封装成了一个日期工具类工具函数大概介绍:1.普通的日期操作2. ...

  5. JAVA 8 日期工具类

    JAVA 8 日期工具类 主题描述 JAVA中日期时间的历史 代码成果 主题描述 JAVA的日期时间一直比较混乱,本来以为joda会是巅峰,但是JAVA 8改变了我的思想.但是即便在JAVA 8面前, ...

  6. java日期工具类DateUtil-续二

    该版本是一次较大的升级,农历相比公历复杂太多(真佩服古人的智慧),虽然有规律,但涉及到的取舍.近似的感念太多,况且本身的概念就已经很多了,我在网上也是查阅了很多的资料,虽然找到一些计算的方法,但都有些 ...

  7. java日期工具类DateUtil

    一名优秀的程序员,不仅需要有着丰富解决问题的方案,还需要的便是代码的沉淀,这不仅有助于自己快速的开发程序,也有利于保证程序的健壮.那如何才能沉淀自己的”代码“呢?从自己编写util开始其实就是一个不错 ...

  8. 日期工具类 DateUtils(继承org.apache.commons.lang.time.DateUtils类)

    /** * */ package com.dsj.gdbd.utils.web; import org.apache.commons.lang3.time.DateFormatUtils; impor ...

  9. JAVA 日期工具类的总结

    一般,在项目中,我们会会经常使用到日期的各种方式的处理,在各个业务逻辑操作中,都需要相关的日期操作,因此,实现项目中的日期工具类的提出,还是十分重要的,下面,就项目中常用到的日期的相关操作方式,做了一 ...

  10. java 日期工具类DateUtils

      日期工具类DateUtils CreateTime--2017年5月27日08:48:00Author:Marydon DateUtils.java-对日期类的进一步封装 import java. ...

随机推荐

  1. 算法学习笔记(8.1): 网络最大流算法 EK, Dinic, ISAP

    网络最大流 目录 网络最大流 EK 增广路算法 Dinic ISAP 作者有话说 前置知识以及更多芝士参考下述链接 网络流合集链接:网络流 最大流,值得是在不超过管道(边)容量的情况下从源点到汇点最多 ...

  2. Nginx12 openresty使用lua-resty-http模块

    1 简介 https://github.com/ledgetech/lua-resty-http 在lua中操作http请求有两种方式 第一种方式:使用通过ngx.location.capture 去 ...

  3. spring源码写注释

    转:https://blog.csdn.net/z_c8819/article/details/105258015 1.从GitHub上下载spring项目 https://github.com/sp ...

  4. IDEA创建新的模块springboot

    1.右键项目-new-moduel 2.选择maven 3.选择jdk 4.输入名字 5.在项目pom文件加入模块依赖(版本管理) <dependency> <groupId> ...

  5. Ceph RGW误删index对象恢复

    版本 [root@control1 ~]# ceph -v ceph version 14.2.22 (ca74598065096e6fcbd8433c8779a2be0c889351) nautil ...

  6. Google Guice 用户指南 - Ⅰ:概览

    译者:kefate 原文:https://github.com/google/guice/wiki/Overview 大家好,我是kefate.今天开始我将会把Google Guice的官方文档陆续翻 ...

  7. .Net Framework创建grpc

    1.环境要求 .Net Framework 4.8 .Net Core 版本: https://www.cnblogs.com/dennisdong/p/17120990.html 2.Stub和Pr ...

  8. P13_协同工作_小程序权限管理的概念以及成员管理的两个方面

    协同工作和发布 - 协同工作 了解权限管理需求 在中大型的公司里,人员的分工非常仔细:同一个小程序项目,一般会有不同岗位.不同角色的员工同时参与设计与开发. 此时出于管理需要,我们迫切需要对不同岗位. ...

  9. DVWA靶场实战(十四)——JavaScript

    DVWA靶场实战(十四) 五.Java Script: 1.漏洞原理: 这里的JavaScript其实是JavaScript Attack也就是JS攻击.JavaScript是一种基于对象和事件驱动的 ...

  10. pycharm用不了pip

    环境: win10,安装有python2和python3,主要使用python3,所有环境变量配合的也是python3,之前一直用的好好的,pip可以在命令行和pycharm中正常使用. pychar ...