获取指定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. ...
随机推荐
- Maven初学习
Maven初学习 摘要:本篇笔记记录了我在初学Maven是认为比较重要的一些知识点. 目录 Maven初学习 1.Maven简介 1.1.项目构建 Ant Maven Gradle 1.2.总结 2. ...
- 第三方模块的下载与使用 requests模块 openpyxl模块
今日内容 第三方模块下载操作 第三方模块: 别人写的魔魁啊 一般情况下都很强大 python中模块很多 如果想使用第三方模块 第一次必须先下载 后面就可以反复使用 =内置模块 下载第三方模块的方式: ...
- 精华推荐 | 【JVM深层系列】「GC底层调优系列」一文带你彻底加强夯实底层原理之GC垃圾回收技术的分析指南(GC原理透析)
前提介绍 很多小伙伴,都跟我反馈,说自己总是对JVM这一块的学习和认识不够扎实也不够成熟,因为JVM的一些特性以及运作机制总是混淆以及不确定,导致面试和工作实战中出现了很多的纰漏和短板,解决广大小伙伴 ...
- Flutter 3.7 新特性:介绍后台isolate通道
Flutter 3.7 发布,本人对其中后台 isolate 通道比较感兴趣,迫不及待翻译了下Aaron Clarke文章,第一次翻译,有不足地方欢迎各位大佬们评论区指正,我将持续更新到本文,谢谢. ...
- drf入门规范、序列化器组件、视图组件、请求与响应
DRF框架之入门规范 本篇文章会详细介绍web开发模式.API接口及其接口测试工具.restful规范.还有经常分不清又很重要的序列化与反序列化的部分,初级交接触APIView.Request类. ...
- React Refs-知识点整理记录
一.Refs的作用 通过Refs,可以访问到 1. DOM节点. 2. render方法中创建的React元素.(class组件的实例) 二.访问节点或者实例有什么用?为什么要使用Refs来访问? 访 ...
- Python标准库pathlib及实例操作
Python标准库pathlib及实例操作 https://docs.python.org/zh-cn/3.9/library/pathlib.html 官网 讲的比较好的文章 https://zhu ...
- MySQL-SQL语法、字段类型
1.字符编码与配置文件 1.\s:查看当前MySQL相关信息:当前用户.版本.编码.端口号. """ Server characterset.Db characterse ...
- ThinkPad E580 装Ubuntu系 系统无WIFI 解决办法
首先得下载 最新的驱动,我之前因为自己的下载的驱动不够新,导致我的驱动一直装不上去 https://github.com/tomaspinho/rtl8821ce 这个是最新的驱动的下载 地址,建议从 ...
- 视觉SLAM:VIO的误差和误差雅可比矩阵
1.两个相机之间的非线性优化 观测相机方程关于相机位姿与特征点的雅可比矩阵: 1.1 位姿: 1.2 3D特征点 fx,fy,fz为相机内参 X',Y',Z'为3D点在相机坐标系下的坐标 该误差是观测 ...