获取指定n个工作日后的日期工具类
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个工作日后的日期工具类的更多相关文章
- java获取n个工作日后的日期, 排除周末和节假日(顺延)
一.写在前面 需求: 工作需要获取n个工作日后的日期, 需要排除weekend和holiday, holiday存在数据库中, 存入的形式是一个节日有起始日期和截止日期(以下文中有关于节假日的表截图) ...
- Java获取上周,本周,本月,本年,开始结束时间 。日期工具类
由于获取日期经常会使用到,所有我自己写了一个工具类 1.基本上能用上的都写出来了,包括:1)获取当天的开始时间 2)获取当天的结束时间 3)获取昨天的开始时间 4)获取昨天的结束时间 5)获取明天的开 ...
- 日期工具类 - DateUtil.java
日期工具类,提供对日期的格式化和转换方法.获取区间日期.指定日期.每月最后一天等. 源码如下:(点击下载 -DateUtil.java.commons-lang-2.6.jar ) import ja ...
- JS 日期工具类-基于yDate
源码下载 前言:最近在用到JS日期操作时,发现有一些不方便,于是搜素了一些网上的资料,基于一个开源工具类-yDate 进行了个性化定制,封装成了一个日期工具类工具函数大概介绍:1.普通的日期操作2. ...
- JAVA 8 日期工具类
JAVA 8 日期工具类 主题描述 JAVA中日期时间的历史 代码成果 主题描述 JAVA的日期时间一直比较混乱,本来以为joda会是巅峰,但是JAVA 8改变了我的思想.但是即便在JAVA 8面前, ...
- java日期工具类DateUtil-续二
该版本是一次较大的升级,农历相比公历复杂太多(真佩服古人的智慧),虽然有规律,但涉及到的取舍.近似的感念太多,况且本身的概念就已经很多了,我在网上也是查阅了很多的资料,虽然找到一些计算的方法,但都有些 ...
- java日期工具类DateUtil
一名优秀的程序员,不仅需要有着丰富解决问题的方案,还需要的便是代码的沉淀,这不仅有助于自己快速的开发程序,也有利于保证程序的健壮.那如何才能沉淀自己的”代码“呢?从自己编写util开始其实就是一个不错 ...
- 日期工具类 DateUtils(继承org.apache.commons.lang.time.DateUtils类)
/** * */ package com.dsj.gdbd.utils.web; import org.apache.commons.lang3.time.DateFormatUtils; impor ...
- JAVA 日期工具类的总结
一般,在项目中,我们会会经常使用到日期的各种方式的处理,在各个业务逻辑操作中,都需要相关的日期操作,因此,实现项目中的日期工具类的提出,还是十分重要的,下面,就项目中常用到的日期的相关操作方式,做了一 ...
- java 日期工具类DateUtils
日期工具类DateUtils CreateTime--2017年5月27日08:48:00Author:Marydon DateUtils.java-对日期类的进一步封装 import java. ...
随机推荐
- 为测试管理正名,华为云CodeArts TestPlan的守护之道
摘要:华为云CodeArts TestPlan既有公有云版本,也有下沉到私有云的版本. 本文分享自华为云社区<为测试管理正名,华为云CodeArts TestPlan的守护之道>,作者:云 ...
- 分布式拒绝服务攻击(DDoS)和僵尸网络(Botnet)
DDos和僵尸网络是相辅相成的两种攻击手段,本文仅介绍基本概念,详细请查看文末参考资料. 分布式拒绝服务攻击(DDoS) 分布式拒绝服务攻击DDoS是一种基于DoS的特殊形式的拒绝服务攻击,是一种分布 ...
- drf-day1——web应用模式、API接口、接口测试工具postman
目录 学习资料 一.web 应用模式 二.API接口 API概念 三.接口测试工具postman postman介绍 postman下载与使用 四.如何在浏览器中测试 学习资料 # 个人博客:http ...
- C-07\字符串的输入输出及常用操作函数
一.算法优化: 减少分支优化 // 求绝对值 int MyAbs(int n) { if (n < 0) { n = ~n + 1; } return n; } // 优化 int MyAbs( ...
- vscode在UBUNTU下使用CMAKE编译
打开一个含有CMakeLists.txt的文件夹 在.vscode要建立三个json文件才能对Cmake工程进行编译和调试,分别是c_cpp_properties.json,launch.json和t ...
- vant组件,picker时间选择,自定义时间选择,实现datePacker,时间选择长期,增加长期选项,用于选择身份证到期时间等...
vant组件,picker时间选择,自定义时间选择,实现datePacker,时间选择长期,增加长期选项,用于选择身份证到期时间等... 最近项目中有个需求,datePicker选项,需要实现增加一个 ...
- C#:开发一个winform窗体程序,实现强势股票池的数据获取。(需对接第三方接口,目前可免费使用)
写在前面:短暂的接触过一段时间的股票市场,只能说A股真的太能杀了! 开发这个工具的初衷呢,是和几个好友在每日做"慈善"后,突发奇想:如果能实时获取当前股市里强势的股票就好了,因为这 ...
- 免杀之:Mimikatz 免杀过杀软,思路学习
免杀之:Mimikatz 免杀过杀软 目录 免杀之:Mimikatz 免杀过杀软 1 环境准备 2 处理过程 2.1 生成原始的Mimikatz程序 2.2 定位到代码或字符串上特征绕过 2.3 定位 ...
- Vulhub 漏洞学习之:Couchdb
Vulhub 漏洞学习之:Couchdb 目录 Vulhub 漏洞学习之:Couchdb 1 Couchdb 垂直权限绕过漏洞(CVE-2017-12635) 1.1 漏洞利用过程 2 Couchdb ...
- 前瞻性研究: axSpA中轴放射学进展延缓得益于TNF抑制剂持续治疗3年
西班牙学者近期发表的这项前瞻性研究是基于axSpA患者注册登记数据库,患者登记入库后,继续治疗和评估3年[1]. 患者分为2组,组1有46例,在登记入库时已经在用肿瘤坏死因子抑制剂(TNFi)且已治疗 ...