提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、获取几个工作日后的日期
  • 二、使用步骤
    • 1.完整代码
  • 总结

前言

看到网上工作日的工具类不是很完整,整理了一份出来


一、获取几个工作日后的日期

1、先预置国家规定的法定节假日,和调休日(特殊工作日)
2、判断当前日期是否为工作日

二、使用步骤

1.完整代码

代码如下(示例):

package utils;import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.*;/*** @Desc:* @Author: ding* @Date: 2022/06/08 10:43**/
@Slf4j
@Component
public class ComputeWorkingDayUtil {//定义两个List,一个存放节假日日期,另一个存放调休的工作日期private static List<String> HOLIDAY_LIST = new ArrayList<>();private static List<String> SPECIAL_WORKDAY_LIST = new ArrayList<>();private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//静态代码块内调用第三方接口拿到数据存进List中static {Map<String, Object> param = new HashMap<String, Object>() {{//这里key值是注册天行API账号是给的   天行网站申请的api-key  https://www.tianapi.com/    put("key", "");put("type", 1);}};//获取当前年份,循环调用3次,拿到3年的数据int currentYear = Calendar.getInstance().get(Calendar.YEAR);for (int i=0; i<3; i++) {param.put("date", currentYear - i);String url = "http://api.tianapi.com/jiejiari/index";String response = HttpUtil.get(url, param);JSONObject resObj = JSONUtil.parseObj(response);int code = (int) resObj.get("code");if (code == 200) {JSONArray newslist = (JSONArray) resObj.get("newslist");for (Object listObj : newslist) {JSONObject obj = (JSONObject) listObj;String holidays = (String) obj.get("vacation");String[] holidayArray = holidays.split("\\|");HOLIDAY_LIST.addAll(Arrays.asList(holidayArray));String remark = (String) obj.get("remark");if (StringUtils.isNotEmpty(remark)) {String[] special = remark.split("\\|");SPECIAL_WORKDAY_LIST.addAll(Arrays.asList(special));}}}else {log.info("调用第三方天行api接口获取节假日信息失败,请注意年底前维护次年节假日和调休日数据!");// 如果请求第三方网站api接口数据失败,则需要   每年12月份左右等国务院公告  提前手动录入每年的法定节假日和调休日String holidays = "2022-01-01,2022-01-02,2022-01-03,2022-01-31,2022-02-01,2022-02-02,2022-02-03,2022-02-04,2022-02-05,2022-02-06," +"2022-04-03,2022-04-04,2022-04-05,2022-04-30,2022-05-01,2022-05-02,2022-05-03,2022-05-04,2022-06-03,2022-06-04,2022-06-05," +"2022-09-10,2022-09-11,2022-09-12,2022-10-01,2022-10-02,2022-10-03,2022-10-04,2022-10-05,2022-10-06,2022-10-07";String specialWorkdays = "2022-01-29,2022-01-30,2022-04-02,2022-04-24,2022-05-27,2022-10-08,2022-10-09";// 转化为数组String[] holidaysArr = holidays.split(",");String[] specialWorkdaysArr = specialWorkdays.split(",");HOLIDAY_LIST = new ArrayList<>(Arrays.asList(holidaysArr));SPECIAL_WORKDAY_LIST = new ArrayList<>(Arrays.asList(specialWorkdaysArr));break;}}}//计算工作日数的方法public static int computeWorkingDays(Date start, Date end) {Calendar startCal = Calendar.getInstance();Calendar endCal = Calendar.getInstance();startCal.setTime(start);endCal.setTime(end);int workDays = 0;//如果没有严格按照起始结束时间传值,在这里纠正下,可以注释掉if (startCal.getTimeInMillis() > endCal.getTimeInMillis()) {startCal.setTime(end);endCal.setTime(start);}while (startCal.getTimeInMillis() <= endCal.getTimeInMillis()) {//控制台打印出来循环情况,方便查看//System.out.println(DateUtil.format(startCal.getTime(), "yyyy-MM-dd") + "   " + DateUtil.format(endCal.getTime(), "yyyy-MM-dd"));String current = DateUtil.format(startCal.getTime(), "yyyy-MM-dd");int dayOfWeek = startCal.get(Calendar.DAY_OF_WEEK);if (dayOfWeek != Calendar.SATURDAY && dayOfWeek != Calendar.SUNDAY){if (!HOLIDAY_LIST.contains(current)) {System.out.println(true);workDays++;}}if (SPECIAL_WORKDAY_LIST.contains(current)) {System.out.println(true);workDays++;}startCal.add(Calendar.DATE, 1);}return workDays;}/*** 获取n个工作日后的日期* @param today opening date* @param num num个工作日后* @return* @throws ParseException*/public static Date getScheduleActiveDate(Date today, int num) throws ParseException {int delay = 1;while(delay <= num){Date tomorrow = getTomorrow(today);String tomorrowStr = sdf.format(tomorrow);//当前日期+1,判断是否是节假日,不是的同时要判断是否是周末,都不是则scheduleActiveDate日期+1if((!isWeekend(tomorrowStr) && !isHoliday(tomorrowStr,HOLIDAY_LIST))|| isExtraWorkdays(tomorrowStr,SPECIAL_WORKDAY_LIST)){delay++;today = tomorrow;} else if (isWeekend(tomorrowStr)){today = tomorrow;} else if (isHoliday(tomorrowStr,HOLIDAY_LIST)){today = tomorrow;}}return today;}/*** 获取n个工作日前的日期* @param today opening date* @param num num个工作日后* @return* @throws ParseException*/public static Date getScheduleActiveDateBefore(Date today, int num) throws ParseException {int delay = 1;while(delay <= num){Date yesterday = getYesterday(today);String tomorrowStr = sdf.format(yesterday);//当前日期+1,判断是否是节假日,不是的同时要判断是否是周末,都不是则scheduleActiveDate日期+1if((!isWeekend(tomorrowStr) && !isHoliday(tomorrowStr,HOLIDAY_LIST))|| isExtraWorkdays(tomorrowStr,SPECIAL_WORKDAY_LIST)){delay++;today = yesterday;} else if (isWeekend(tomorrowStr)){today = yesterday;} else if (isHoliday(tomorrowStr,HOLIDAY_LIST)){today = yesterday;}}return today;}/*** 获取tomorrow的日期** @param date* @return*/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;}/*** 获取yesterday的日期** @param date* @return*/public static Date getYesterday(Date date){Calendar calendar = Calendar.getInstance();calendar.setTime(date);calendar.add(Calendar.DAY_OF_MONTH, -1);date = calendar.getTime();return date;}/*** 判断是否是weekend** @param sdate* @return* @throws ParseException*/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** @param sdate* @param list* @return* @throws ParseException*/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;}/*** 判断是否是由于放假需要额外工作的周末** @param sdate* @param list* @return* @throws ParseException*/public static boolean isExtraWorkdays(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 isWorkingDay(Date date) {LocalDateTime localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();String dateStr = sdf.format(date);//是否加班日if(SPECIAL_WORKDAY_LIST.contains(dateStr)){return true;}//是否节假日if(HOLIDAY_LIST.contains(dateStr)){return false;}//如果是1-5表示周一到周五  是工作日DayOfWeek week = localDate.getDayOfWeek();if(week==DayOfWeek.SATURDAY||week==DayOfWeek.SUNDAY){return false;}return true;}public static void main(String[] args) throws Exception {Date workDay = getScheduleActiveDateBefore(new Date(),2);Calendar cal = Calendar.getInstance();cal.setTime(workDay);cal.add(Calendar.HOUR,23);cal.add(Calendar.MINUTE,59);cal.add(Calendar.SECOND,59);System.out.println(workDay);}}

总结

个人整理的比较粗糙

java获取工作日工具类相关推荐

  1. java获取属性工具类,Java中常用的工具类总结

    在Java中,工具类定义了一组公共方法,这篇文章将介绍Java中使用最频繁及最通用的Java工具类. 有了这些轮子,会使代码更加简洁,优美, 但是需要经常看看大佬的源码, 这样才会有进步! 不能光会用 ...

  2. Java获取IP工具类以及使用

    工具类 package org.test.util;import java.io.BufferedReader; import java.io.IOException; import java.io. ...

  3. Java获取时间戳工具类Utils

    常用日期工具类

  4. java 计算工作日工具类

    package com.b2bwings.cqjy.common.util;import org.apache.commons.lang.time.DateFormatUtils;import jav ...

  5. java获取Ip工具类

    import com.alibaba.druid.util.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; ...

  6. java获取随机数工具类

    public class RandomUtil {/*** 生成一个0 到 count 之间的随机数*/public static int getNum(int endNum){if(endNum & ...

  7. java 获取service_Java service层获取HttpServletRequest工具类的方法

    Java service层获取HttpServletRequest工具类的方法 大家都知道 能在Controller/action层获取HttpServletRequest,但是这里给大家备份的是从代 ...

  8. Java service层获取HttpServletRequest工具类的方法

    大家都知道 能在Controller/action层获取HttpServletRequest ,但是这里给大家备份的是从代码内部service层获取HttpServletRequest工具类. 具体如 ...

  9. Java封装OkHttp3工具类

    点击关注公众号,Java干货及时送达  作者:如漩涡 https://blog.csdn.net/m0_37701381 Java封装OkHttp3工具类,适用于Java后端开发者 说实在话,用过挺多 ...

最新文章

  1. java需要记的语法,Java笔记(三)……基础语法
  2. java中为什么不能通过getClass().getName()获取父类的类名
  3. 做了5年Java,java读写锁使用
  4. 无根树转为有根数(图论) By ACReaper
  5. leetcode —— 11. 盛最多水的容器
  6. MySQL 的 Web 界面、前端或 GUI 工具
  7. 判断一个字符串出现次数最多的字符,并返回这个字符和次数
  8. java jpa面试题_jpa面试题解析,java面试题
  9. JavaScript函数思维导图
  10. 免费收录网站搜索引擎登录口大全
  11. [BScroll warn]: Can not resolve the wrapperDOM. .......
  12. 服务器虚拟机迁移的6个步骤,KVM 虚拟机迁移(示例代码)
  13. 单元格下拉框实现复选框多选_将复选框链接到带有宏的单元格
  14. 【转载】Linux查看日志
  15. 编程语言Python为什么这么火?
  16. 编译指示_#pragma在DSP中的编程技巧
  17. 网络爬虫之东方财富网股票板块
  18. NIO核心设计与原理
  19. SAP中会计凭证数据表关系的简单验证
  20. 莫队算法(小Z的袜子)

热门文章

  1. 操作系统 - 基础、硬件基础
  2. Blender-烘焙动画,解除约束父子级,导入UE4
  3. vue各组件之间多种通信方式
  4. 交叉熵损失函数原理及pytorch实现
  5. 移动互联网 3G时代的“新宠”
  6. Java | JFrame中setLayout的意思
  7. js正则表达式的匹配函数返回数组问题
  8. K均值聚类和DBSCAN介绍
  9. 7-1 Forever (20分)
  10. Excel拼接后的字符串复制文本到word中出现换行符