news 2026/5/1 11:18:12

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/5/1 8:39:44

造相-Z-Image部署教程:WSL2+RTX 4090 Windows子系统本地运行方案

造相-Z-Image部署教程&#xff1a;WSL2RTX 4090 Windows子系统本地运行方案 1. 为什么选这个方案&#xff1f;——写实出图快、不联网、不爆显存 你是不是也遇到过这些情况&#xff1a; 想用最新文生图模型&#xff0c;但云服务要排队、要付费、还要上传提示词&#xff1b;下…

作者头像 李华
网站建设 2026/5/1 10:03:44

如何用Unsloth实现高效低成本模型训练

如何用Unsloth实现高效低成本模型训练 在大模型时代&#xff0c;微调一个高质量语言模型动辄需要多张A100或H100显卡&#xff0c;动辄数万元的算力成本&#xff0c;让很多团队望而却步。但如果你只有一张3090、4090&#xff0c;甚至只是RTX 3060&#xff0c;是否就彻底告别模型…

作者头像 李华
网站建设 2026/5/1 9:55:42

自定义迭代器设计

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

作者头像 李华
网站建设 2026/5/1 11:08:41

RexUniNLU零样本NLP实战:5分钟搞定中文文本分类与实体识别

RexUniNLU零样本NLP实战&#xff1a;5分钟搞定中文文本分类与实体识别 1. 开场就上手&#xff1a;不用训练、不写代码&#xff0c;中文NLP也能“说干就干” 你有没有遇到过这些场景&#xff1f; 客服团队每天收到上千条用户反馈&#xff0c;想自动分出“物流问题”“产品质量…

作者头像 李华
网站建设 2026/5/1 7:24:52

想自己训练模型?先看懂cv_resnet18_ocr-detection训练日志

想自己训练模型&#xff1f;先看懂cv_resnet18_ocr-detection训练日志 你是不是也遇到过这样的困惑&#xff1a;WebUI里点几下就能微调OCR模型&#xff0c;但点下“开始训练”后&#xff0c;控制台刷出一长串密密麻麻的日志&#xff0c;满屏的loss: 0.4231, lr: 0.00697, acc:…

作者头像 李华