news 2026/4/23 16:45:20

java计算当前日期后N个工作日的日期

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java计算当前日期后N个工作日的日期

在工作中遇到涉及工作日相关的需求,下面是个工具类

WorkDayUtils如下:

packagecom.sqds.utils;importorg.apache.commons.lang.StringUtils;importjava.text.SimpleDateFormat;importjava.util.*;/** * 工作日计算工具类 * Created by MJ·J on 2019-05-24 */publicclassWorkDayUtils{privatestaticSimpleDateFormatsdf=newSimpleDateFormat("yyyy-MM-dd");/*private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");*//** * 获取当前时间之前n个工作日的日期 * * @param holidays 节假日(日期格式:2019-01-01,2019-01-04,2019-01-05,......) * @param today 当前日期(日期格式:2019-01-01 08:08:08) * @param num 需要设置的n个工作日 * @return * @throws Exception */publicstaticStringgetWorkDayStart(Stringholidays,Stringtoday,intnum)throwsException{// 转化为数组String[]dayArr=holidays.split(",");List<String>holidayList=newArrayList<String>(Arrays.asList(dayArr));// 将字符串转换成日期Datedate=sdf.parse(today);// 获取工作日DateworkDay=getWorkDay(holidayList,num,date,-1);StringworkDayStr=sdf.format(workDay);longworkTime=getTime(today,workDayStr)-1000;// 减1秒returnsdf.format(newDate(workTime));}/** * 获取当前时间之后n个工作日的日期 * * @param dd 当前日期 * @param num 需要设置的n个工作日 * @return * @throws Exception */publicstaticDategetWorkDayEnd(Datedd,intnum)throwsException{// 节假日Stringholidays="2019-01-01,2019-01-04,2019-01-05,2019-01-06,2019-01-07,2019-01-08,2019-01-09,2019-01-10,2019-04-05,2019-04-06,2019-04-07,2019-05-01,2019-06-07,2019-06-08,2019-06-09,2019-09-13,2019-09-14,2019-09-15,2019-10-01,2019-10-02,2019-10-03,2019-10-04,2019-10-05,2019-10-06,2019-10-07";// 当前时间Stringtoday=sdf.format(dd);// 转化为数组String[]dayArr=holidays.split(",");List<String>holidayList=newArrayList<String>(Arrays.asList(dayArr));// 将字符串转换成日期Datedate=sdf.parse(today);// 获取工作日DateworkDay=getWorkDay(holidayList,num,date,1);StringworkDayStr=sdf.format(workDay);longworkTime=getTime(today,workDayStr)+1000;// 加1秒returnnewDate(workTime);}/** * 获取当前时间之后n个工作日的日期 * * @param holidays 节假日(日期格式:2019-01-01,2019-01-04,2019-01-05,......) * @param today 当前日期(日期格式:2019-01-01 08:08:08) * @param num 需要设置的n个工作日 * @return * @throws Exception */publicstaticStringgetWorkDayEnd(Stringholidays,Stringtoday,intnum)throwsException{// 转化为数组String[]dayArr=holidays.split(",");List<String>holidayList=newArrayList<String>(Arrays.asList(dayArr));// 将字符串转换成日期Datedate=sdf.parse(today);// 获取工作日DateworkDay=getWorkDay(holidayList,num,date,1);StringworkDayStr=sdf.format(workDay);longworkTime=getTime(today,workDayStr)+1000;// 加1秒returnsdf.format(newDate(workTime));}/** * 获取当前时间之后n个工作日的日期 * @param today 当前日期(日期格式:2019-01-01 08:08:08) * @param num 需要设置的n个工作日 * @return * @throws Exception */publicstaticStringgetWorkDayEnd(Stringtoday,intnum)throwsException{// 节假日Stringholidays="2019-01-01,2019-01-04,2019-01-05,2019-01-06,2019-01-07,2019-01-08,2019-01-09,2019-01-10,2019-04-05,2019-04-06,2019-04-07,2019-05-01,2019-06-07,2019-06-08,2019-06-09,2019-09-13,2019-09-14,2019-09-15,2019-10-01,2019-10-02,2019-10-03,2019-10-04,2019-10-05,2019-10-06,2019-10-07";// 转化为数组String[]dayArr=holidays.split(",");List<String>holidayList=newArrayList<String>(Arrays.asList(dayArr));// 将字符串转换成日期Datedate=sdf.parse(today);// 获取工作日DateworkDay=getWorkDay(holidayList,num,date,1);StringworkDayStr=sdf.format(workDay);longworkTime=getTime(today,workDayStr)+1000;// 加1秒returnsdf.format(newDate(workTime));}/** * 获取工作日 * * @param holidayList 节假日(日期格式:2019-01-01,2019-01-04,2019-01-05,......) * @param num 需要设置的n个工作日 * @param day 目标日期 * @return * @throws Exception */publicstaticDategetWorkDay(List<String>holidayList,intnum,Dateday,intn)throwsException{intdelay=1;while(delay<=num){// 获取前一天或后一天日期DateendDay=getDate(day,n);Stringtime=sdf.format(endDay);//当前日期+1即tomorrow,判断是否是节假日,同时要判断是否是周末,都不是则将scheduleActiveDate日期+1,直到循环num次即可if(!isWeekend(time)&&!isHoliday(time,holidayList)){delay++;}/* else if (isWeekend(time)) { System.out.println(time + "::是周末"); } else if (isHoliday(time, holidayList)) { System.out.println(time + "::是节假日"); }*/day=endDay;}returnday;}/** * yyyy-MM-dd HH:mm:ss格式日期---获取时间戳精确到秒 * * @param start 开始日期(日期格式:2019-01-01 08:08:08) * @param end 结束日期(日期格式:2019-01-01 08:08:08) * @return * @throws Exception */publicstaticlonggetTime(Stringstart,Stringend)throwsException{if(org.apache.commons.lang.StringUtils.isEmpty(start)||StringUtils.isEmpty(end)){thrownewRuntimeException("today is empty");}longtime1=sdf.parse(start).getTime();longtime2=sdf.parse(start).getTime();longtime3=sdf.parse(end).getTime();longtime=time3+(time1-time2);returntime;}/** * 获取前一天或后一天日期 * * @param date 日期 * @param n 判断参数 * @return */publicstaticDategetDate(Datedate,intn){if(n>0){// 获取前一天date=getTomorrow(date);}if(n<0){// 获取后一天date=getYesterday(date);}returndate;}/** * 获取后一天的日期 * * @param date * @return */publicstaticDategetTomorrow(Datedate){Calendarcalendar=Calendar.getInstance();calendar.setTime(date);calendar.add(Calendar.DAY_OF_MONTH,+1);date=calendar.getTime();returndate;}/** * 获取前一天的日期 * * @param date * @return */publicstaticDategetYesterday(Datedate){Calendarcalendar=Calendar.getInstance();calendar.setTime(date);calendar.add(Calendar.DAY_OF_MONTH,-1);date=calendar.getTime();returndate;}/** * 判断是否是周末 * * @param sdate * @return * @throws Exception */publicstaticbooleanisWeekend(Stringsdate)throwsException{Datedate=sdf.parse(sdate);Calendarcal=Calendar.getInstance();cal.setTime(date);if(cal.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY||cal.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY){returntrue;}else{returnfalse;}}/** * 判断是否是节假日 * * @param sdate * @param list * @return * @throws Exception */publicstaticbooleanisHoliday(Stringsdate,List<String>list)throwsException{if(list.size()>0){for(inti=0;i<list.size();i++){if(sdate.equals(list.get(i))){returntrue;}}}returnfalse;}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 15:32:05

StructBERT开源镜像技术解析:Flask封装逻辑与RESTful接口设计细节

StructBERT开源镜像技术解析&#xff1a;Flask封装逻辑与RESTful接口设计细节 1. 为什么需要一个专为中文语义匹配而生的本地工具 你有没有遇到过这样的问题&#xff1a;用现成的文本向量模型计算两句话的相似度&#xff0c;结果“苹果手机”和“香蕉牛奶”居然有0.62的相似分…

作者头像 李华
网站建设 2026/4/23 14:16:16

零基础玩转Qwen-Image-2512:5分钟生成惊艳AI画作

零基础玩转Qwen-Image-2512&#xff1a;5分钟生成惊艳AI画作 你有没有过这样的时刻——脑子里突然闪过一个画面&#xff1a;一只青花瓷纹样的狐狸蹲在敦煌月牙泉边&#xff0c;身后是流动的星河与飞天飘带。你想把它画出来&#xff0c;却连铅笔都还没拿起&#xff1b;你想找设…

作者头像 李华
网站建设 2026/4/23 14:16:26

lychee-rerank-mm部署教程:Kubernetes Helm Chart封装实践分享

lychee-rerank-mm部署教程&#xff1a;Kubernetes Helm Chart封装实践分享 1. 为什么需要把lychee-rerank-mm放进Kubernetes 你可能已经试过在本地跑lychee load&#xff0c;几秒钟后打开http://localhost:7860就能用上这个多模态重排序模型——界面清爽、响应快、支持图文混…

作者头像 李华
网站建设 2026/4/23 14:18:26

Clawdbot惊艳效果:Qwen3:32B在多模态代理(图文协同)中的潜力展示

Clawdbot惊艳效果&#xff1a;Qwen3:32B在多模态代理&#xff08;图文协同&#xff09;中的潜力展示 1. 什么是Clawdbot&#xff1f;一个让AI代理真正“活起来”的平台 你有没有试过这样一种场景&#xff1a;想让AI同时看懂一张产品图、理解用户提问、再结合商品参数生成专业…

作者头像 李华
网站建设 2026/4/23 14:15:55

GLM-4.7-Flash保姆级教程:从零开始部署最强开源LLM

GLM-4.7-Flash保姆级教程&#xff1a;从零开始部署最强开源LLM 你是否试过在本地跑一个30B参数的大模型&#xff0c;却卡在环境配置、显存报错、服务启动失败的循环里&#xff1f;是否想用上最新最强的国产开源大模型&#xff0c;又担心部署门槛太高、文档不全、调试无门&…

作者头像 李华
网站建设 2026/4/23 13:39:48

低成本玩转GLM-4v-9b:INT4量化版9G显存需求亲测

低成本玩转GLM-4v-9b&#xff1a;INT4量化版9G显存需求亲测 你是否也遇到过这样的困境&#xff1a;想用高性能多模态模型做图像理解、图表分析或中英文视觉问答&#xff0c;却卡在显存门槛上&#xff1f;RTX 4090 24GB 显卡明明在手&#xff0c;加载一个9B参数的视觉语言模型却…

作者头像 李华