news 2026/6/10 1:24:57

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/6/6 7:03:13

StructBERT中文情感分析镜像发布|CPU友好+开箱即用的WebUI与API

StructBERT中文情感分析镜像发布&#xff5c;CPU友好开箱即用的WebUI与API 1. 为什么你需要一个真正能跑在CPU上的中文情感分析工具&#xff1f; 你是不是也遇到过这些情况&#xff1a; 想快速验证一段用户评论的情绪倾向&#xff0c;但手头没有GPU服务器&#xff0c;本地笔…

作者头像 李华
网站建设 2026/6/6 6:45:41

C++中的类型标签分发

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value)&#xff1a;查找第一个等于 value 的元素&#xff0c;返回迭代器&#xff08;未找到返回 end&#xff09;。find_if(begin, end, predicate)&#xff1a;查找第…

作者头像 李华
网站建设 2026/6/6 7:55:00

告别复杂配置:Qwen2.5-7B微调镜像开箱即用体验分享

告别复杂配置&#xff1a;Qwen2.5-7B微调镜像开箱即用体验分享 你是否也曾面对大模型微调望而却步&#xff1f;不是卡在环境搭建&#xff0c;就是困于依赖冲突&#xff1b;不是被CUDA版本折磨&#xff0c;就是被ms-swift、peft、transformers的版本组合绕晕&#xff1b;更别说…

作者头像 李华
网站建设 2026/6/7 16:00:48

Ollama镜像免配置实战:translategemma-27b-it图文翻译效果惊艳呈现

Ollama镜像免配置实战&#xff1a;translategemma-27b-it图文翻译效果惊艳呈现 1. 这不是普通翻译模型&#xff0c;是能“看图说话”的双模态翻译专家 你有没有遇到过这样的场景&#xff1a; 一张产品说明书截图全是中文&#xff0c;但客户急着要英文版&#xff1b; 朋友圈里…

作者头像 李华
网站建设 2026/6/5 13:53:47

模板代码跨编译器兼容

1、非修改序列算法这些算法不会改变它们所操作的容器中的元素。1.1 find 和 find_iffind(begin, end, value)&#xff1a;查找第一个等于 value 的元素&#xff0c;返回迭代器&#xff08;未找到返回 end&#xff09;。find_if(begin, end, predicate)&#xff1a;查找第一个满…

作者头像 李华
网站建设 2026/6/9 22:52:41

高性能计算通信库

1、非修改序列算法 这些算法不会改变它们所操作的容器中的元素。 1.1 find 和 find_if find(begin, end, value)&#xff1a;查找第一个等于 value 的元素&#xff0c;返回迭代器&#xff08;未找到返回 end&#xff09;。find_if(begin, end, predicate)&#xff1a;查找第…

作者头像 李华