1、说明:

获取n个工作日后的日期(包含法定节假日、双休日、节后补班),需要在数据库手动入库当年的法定节假日及节假日调休补班。(也可写在配置文件中读取)。

2、工具类代码

/**

* @author: huangyibo

* @Date: 2021/1/22 22:16

* @Description: 用于查询n个工作日(包含法定节假日、双休日、调休)后的日期

*/

public class HolidayUtils {

private static final Logger logger = LoggerFactory.getLogger(HolidayUtils.class);

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

/**

* 用于判断n个工作日(排除节假日、周六日包含节后补班数据)后的日期

* @param list 节假日数据源

* @param weekDayList 节后补班数据源

* @param today 计算开始时间

* @param num 多少个工作日 根据需要自行安排

* @return

*/

public static Date getScheduleActiveDate(List list, List weekDayList, Date today, int num) throws ParseException {

String today1 = HolidayUtils.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)){

logger.info("HolidayUtils.getScheduleActiveDate {}: 是节假日调休补班",sdf.format(tomorrow));

}else{

logger.info("HolidayUtils.getScheduleActiveDate {}: 是正常工作日",sdf.format(tomorrow));

}

delay++;

today = tomorrow;

}else if (isHoliday(sdf.format(tomorrow),list)){

// tomorrow = getTomorrow(tomorrow);

today = tomorrow;

logger.info("HolidayUtils.getScheduleActiveDate {}: 是节假日",sdf.format(tomorrow));

}else if(isWeekend(sdf.format(tomorrow))){//是周六日并且不是节后补班

if(!isWorkWeekDay(sdf.format(tomorrow),weekDayList)){

today = tomorrow;

logger.info("HolidayUtils.getScheduleActiveDate {}: 是休息日",sdf.format(tomorrow));

}

}

}

logger.info("HolidayUtils.getScheduleActiveDate, {}后{}个工作日后,日期为:{}",today1,num,sdf.format(today));

return today;

}

/**

* 获取明天的日期

*/

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 dateStr) throws ParseException {

Date date = sdf.parse(dateStr);

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 dateStr, List list) {

if(!CollectionUtils.isEmpty(list)){

for(int i = 0; i < list.size(); i++){

if(dateStr.equals(list.get(i))){

return true;

}

}

}

return false;

}

/**

* 判断是否是补班

*/

public static boolean isWorkWeekDay(String dateStr, List list) throws ParseException {

if(!CollectionUtils.isEmpty(list)){

for(int i = 0; i < list.size(); i++){

if(dateStr.equals(list.get(i))){

return true;

}

}

}

return false;

}

/**

* 把日期格式化成字符串

* @param date

* @param format 例: yyyy-MM-dd

* @return

*/

public static String parseDate(Date date, String format) {

SimpleDateFormat formater = new SimpleDateFormat(format);

return formater.format(date);

}

}

3、测试调用

public static void main(String[] args) {

WorkDayQuery workDayQuery = new WorkDayQuery();

Calendar calendar = Calendar.getInstance();

String nowYear = String.valueOf(calendar.get(Calendar.YEAR));

workDayQuery.setWorkYear(nowYear);

//获取当前年和下一年的节假日和周末补班日期

List workDayList = workDayFeign.queryWorkDayByYear(workDayQuery);

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

//节假日集合

List holidayList = workDayList.stream()

.filter(holiday -> "0".equals(holiday.getType()))

.map(holiday -> sdf.format(holiday.getWorkDay())).collect(Collectors.toList());

//周末补班日集合

List workdayList = workDayList.stream()

.filter(workDay -> "1".equals(workDay.getType()))

.map(workDay -> sdf.format(workDay.getWorkDay())).collect(Collectors.toList());

try {

Date scheduleActiveDate = HolidayUtils.getScheduleActiveDate(holidayList, workdayList, new Date(), 5);

} catch (ParseException e) {

logger.error("工作日计算异常", e);

}

}

4、sql脚本

DROP TABLE IF EXISTS `holiday`;

CREATE TABLE `holiday` (

`GUID` varchar(36) COLLATE utf8_bin NOT NULL,

`WORKDAY` varchar(10) COLLATE utf8_bin DEFAULT NULL,

`TYPE` varchar(1) COLLATE utf8_bin DEFAULT NULL COMMENT '0:法定节假日;1 节假日调休补班(如某个节假日前后周六日上班的情况)',

PRIMARY KEY (`GUID`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='此表需每年根据法定节假日具体时间更新一次';

-- ----------------------------

-- Records of holiday

-- ----------------------------

INSERT INTO `holiday` VALUES ('1', '2019-05-01', '0');

INSERT INTO `holiday` VALUES ('10', '2019-09-15', '0');

INSERT INTO `holiday` VALUES ('11', '2019-10-01', '0');

INSERT INTO `holiday` VALUES ('12', '2019-10-02', '0');

INSERT INTO `holiday` VALUES ('13', '2019-10-03', '0');

INSERT INTO `holiday` VALUES ('14', '2019-10-04', '0');

INSERT INTO `holiday` VALUES ('15', '2019-10-05', '0');

INSERT INTO `holiday` VALUES ('16', '2019-10-06', '0');

INSERT INTO `holiday` VALUES ('17', '2019-10-07', '0');

INSERT INTO `holiday` VALUES ('18', '2019-04-28', '1');

INSERT INTO `holiday` VALUES ('19', '2019-05-05', '1');

INSERT INTO `holiday` VALUES ('2', '2019-05-02', '0');

INSERT INTO `holiday` VALUES ('20', '2019-09-29', '1');

INSERT INTO `holiday` VALUES ('21', '2019-10-12', '1');

INSERT INTO `holiday` VALUES ('3', '2019-05-03', '0');

INSERT INTO `holiday` VALUES ('4', '2019-05-04', '0');

INSERT INTO `holiday` VALUES ('5', '2019-06-07', '0');

INSERT INTO `holiday` VALUES ('6', '2019-06-08', '0');

INSERT INTO `holiday` VALUES ('7', '2019-06-09', '0');

INSERT INTO `holiday` VALUES ('8', '2019-09-13', '0');

INSERT INTO `holiday` VALUES ('9', '2019-09-14', '0');

java节假日 调休的代码,java 获取n个工作日后的日期(包含法定节假日、双休日、节后补班)...相关推荐

  1. java获取法定节假日_java 获取n个工作日后的日期(包含法定节假日、双休日、节后补班)...

    1.说明: 获取n个工作日后的日期(包含法定节假日.双休日.节后补班),需要在数据库手动入库当年的法定节假日及节假日调休补班.(也可写在配置文件中读取) 2.工具类代码 import java.tex ...

  2. java 获取假期时间_java 获取n个工作日后的日期(包含法定节假日、双休日、节后补班)...

    1.说明: 获取n个工作日后的日期(包含法定节假日.双休日.节后补班),需要在数据库手动入库当年的法定节假日及节假日调休补班.(也可写在配置文件中读取) 2.工具类代码 import java.tex ...

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

    java获取n个工作日后的日期, 排除周末和节假日(顺延) 一.需求分析 需求描述 思路解析 二.以下为测试代码(测试时日期为2018-08-28) 三.应用 1.首先看一下我数据库中存放的holid ...

  4. java 法定节假日_java 获取n个工做往后的日期(包含法定节假日、双休日、节后补班)...

    1.说明:java 获取n个工做往后的日期(包含法定节假日.双休日.节后补班),须要在数据库手动入库当年的法定节假日及节假日调休补班.(也可写在配置文件中读取)sql 2.工具类代码数据库 impor ...

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

    工作中遇到的一个小问题,需要获取指定天数的工作日后的日期,比如:3个工作日后的日期. 从网上没有找到完全符合要求的例子,只好自己写一个,在这里记录一下. package com.linkcld.ecm ...

  6. JAVA 根据传入的时间和增加的小时(n),跳过法定节假日和工作休息时间获取时间

    目录 前言 一.导入每年的法定节假日(我这里入库) 二.创建工具类 1.创建map(用来存放法定节假日) 2.根据传入时间算出跳过法定节假日的时间 3.根据传入时间算出跳过法定节假日和工作日休息时间的 ...

  7. php根据当前日期判断法定节假日_php如何计算指定工作日后的日期?

    问 题 例如:今天是2017-1-24 计算20个工作日后的时间 工作日就是周一到周五.法定假期前后调休需上班的都算作工作日,周六.周日和法定假日则不算工作日. 有什么好的办法吗 解决方案 提供个思路 ...

  8. java万年历课程设计代码,JAVA《万年历系统》课程设计

    JAVA<万年历系统>课程设计 面向对象程序设计面向对象程序设计 课程设计报告课程设计报告 题目题目 万年历系统万年历系统 专业专业 计算机科学与技术计算机科学与技术 班级班级 姓名姓名 ...

  9. JAVA获取N个工作日后的时间的工具类、考虑上班时间、时区

    DayWorkTime代表工作时间描述类 HolidayUtils是计算时间的工具类,addSecondByWorkDay用于计算时间加上指定秒后的工作时间,会自动跳过周末.节假日等.其中holida ...

最新文章

  1. Java ClassLoader详解
  2. 8.Spring Cloud Alibaba教程:整合Seata分布式事务
  3. android jni malloc和free的使用
  4. 函数最值题目及答案_呆哥数学每日一题 ——多元函数求最值
  5. wpf 切换搜狗输入法英文_搜狗输入法全新升级手写功能,中英数字自由写,告别切换丨本周新闻...
  6. MaxCompute JOIN优化小结
  7. zabbix设置mysql登陆免报警_zabbix3.0.2 监控mysql服务down的时候不触发报警的问题修复...
  8. 六个重要的.NET概念:栈、堆、值类型、引用类型、装箱和拆箱
  9. asp.net 小记
  10. 前端 视频标签 video的一些特殊属性详解
  11. MAX96706开发板POC电路分析
  12. 2021智源大会AI TIME|大规模预训练模型离通用人工智能还有多远?
  13. 剑指offe 面试题5, 从尾到头打印链表
  14. 科学计算机后盖换电池,图吧小白教程 篇二十二:手把手教你给手机换电池(拆机)...
  15. 关于买房提前还款问题
  16. 【嵌入式小技巧】STM32 实现 SEGGER RTT 打印(超详细)
  17. 转载~高德地图绘制图形并得到面积
  18. formidable示例运行报错,解决方法
  19. AS608指纹模块高级功能实现(一):底层数据传输——指纹特征库上传给上位机
  20. 爱福窝在线装修设计软件测评

热门文章

  1. 南京驾照过期申请新的驾照流程
  2. it生活的第一年总结
  3. 【坑】PHP switch 比较表达式
  4. 身份证号码是18位数字字符构成的字符串,输入一个身份证号码判断该号码拥有者的性别
  5. 上海招聘java程序员有哪些要求
  6. volatile 的 随笔录
  7. php 漂亮翻页,好看的翻页切换效果插件-BOOKLET
  8. 百度脑图核心——kityminder-editor 本地化改造
  9. android开发游记:仿支付宝余额数字累加滚动效果的实现
  10. Microsoft Visual Studio 2019 下载与离线安装教程