如图,合同中有很多这种日期计算,故封装一通用工具类,记录于此。需求如下:

WorkDayUtils如下:

package com.sqds.utils;import org.apache.commons.lang.StringUtils;import java.text.SimpleDateFormat;
import java.util.*;/*** 工作日计算工具类* Created by MJ·J on 2019-05-24*/
public class WorkDayUtils {private static SimpleDateFormat sdf = new SimpleDateFormat("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*/public static String getWorkDayStart(String holidays, String today, int num) throws Exception {// 转化为数组String[] dayArr = holidays.split(",");List<String> holidayList = new ArrayList<String>(Arrays.asList(dayArr));// 将字符串转换成日期Date date = sdf.parse(today);// 获取工作日Date workDay = getWorkDay(holidayList, num, date, -1);String workDayStr = sdf.format(workDay);long workTime = getTime(today, workDayStr) - 1000;    // 减1秒return sdf.format(new Date(workTime));}/*** 获取当前时间之后n个工作日的日期** @param dd    当前日期* @param num      需要设置的n个工作日* @return* @throws Exception*/public static Date getWorkDayEnd( Date dd, int num) throws Exception {// 节假日String holidays = "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 today = sdf.format(dd);// 转化为数组String[] dayArr = holidays.split(",");List<String> holidayList = new ArrayList<String>(Arrays.asList(dayArr));// 将字符串转换成日期Date date = sdf.parse(today);// 获取工作日Date workDay = getWorkDay(holidayList, num, date, 1);String workDayStr = sdf.format(workDay);long workTime = getTime(today, workDayStr) + 1000;    // 加1秒return new Date(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*/public static String getWorkDayEnd(String holidays, String today, int num) throws Exception {// 转化为数组String[] dayArr = holidays.split(",");List<String> holidayList = new ArrayList<String>(Arrays.asList(dayArr));// 将字符串转换成日期Date date = sdf.parse(today);// 获取工作日Date workDay = getWorkDay(holidayList, num, date, 1);String workDayStr = sdf.format(workDay);long workTime = getTime(today, workDayStr) + 1000;    // 加1秒return sdf.format(new Date(workTime));}/*** 获取当前时间之后n个工作日的日期* @param today    当前日期(日期格式:2019-01-01 08:08:08)* @param num      需要设置的n个工作日* @return* @throws Exception*/public static String getWorkDayEnd( String today, int num) throws Exception {// 节假日String holidays = "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 = new ArrayList<String>(Arrays.asList(dayArr));// 将字符串转换成日期Date date = sdf.parse(today);// 获取工作日Date workDay = getWorkDay(holidayList, num, date, 1);String workDayStr = sdf.format(workDay);long workTime = getTime(today, workDayStr) + 1000;    // 加1秒return sdf.format(new Date(workTime));}/*** 获取工作日** @param holidayList 节假日(日期格式:2019-01-01,2019-01-04,2019-01-05,......)* @param num         需要设置的n个工作日* @param day         目标日期* @return* @throws Exception*/public static Date getWorkDay(List<String> holidayList, int num, Date day, int n) throws Exception {int delay = 1;while (delay <= num) {// 获取前一天或后一天日期Date endDay = getDate(day, n);String time = 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;}return day;}/*** 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*/public static long getTime(String start, String end) throws Exception {if (org.apache.commons.lang.StringUtils.isEmpty(start) || StringUtils.isEmpty(end)) {throw new RuntimeException("today is empty");}long time1 = sdf.parse(start).getTime();long time2 = sdf.parse(start).getTime();long time3 = sdf.parse(end).getTime();long time = time3 + (time1 - time2);return time;}/*** 获取前一天或后一天日期** @param date 日期* @param n    判断参数* @return*/public static Date getDate(Date date, int n) {if (n > 0) {    // 获取前一天date = getTomorrow(date);}if (n < 0) {    // 获取后一天date = getYesterday(date);}return date;}/*** 获取后一天的日期** @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;}/*** 获取前一天的日期** @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;}/*** 判断是否是周末** @param sdate* @return* @throws Exception*/public static boolean isWeekend(String sdate) throws Exception {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;}}/*** 判断是否是节假日** @param sdate* @param list* @return* @throws Exception*/public static boolean isHoliday(String sdate, List<String> list) throws Exception {if (list.size() > 0) {for (int i = 0; i < list.size(); i++) {if (sdate.equals(list.get(i))) {return true;}}}return false;}
}

java计算当前日期后N个工作日的日期相关推荐

  1. Java根据当前日期获得这一周的日期

    为什么80%的码农都做不了架构师?>>>    Java根据当前日期获得这一周的日期,不是很经常用,但是用起来又不是很好找的代码! /*** 测试* @param args*/pub ...

  2. java获取当前日期 前后 几个月的 日期期间 往前 2个月 往后 2个月

    java获取当前日期 前后 几个月的 日期期间 需要原因 返回的String 格式 private Map<String,String> getDuringDate(){SimpleDat ...

  3. Oracle计算当前日期在N个工作日之后的日期

    最近项目中有一个自动扣款的需求,需要在商品出售之后 7 个工作日之后进行自动扣款,由此封装了一个存储过程以便于调用. 注意:本示例使用oracle. 一.创建一张GGHOLIDAY表并insert部分 ...

  4. Java计算当前日期距离生日还有多少天

    1.键盘录入你的生日字符串 (如:"1998年08月08日")2.计算当前日期距离生日那天有多少天? public static void main(String[] args) ...

  5. js和java得到当前日期和三十天以前日期

    js: //获取当前日期 var myDate = new Date(); var nowY = myDate.getFullYear(); var nowM = myDate.getMonth()+ ...

  6. java计算剩余天数_JAVA 比较两个日期相差的天数

    在实际的应用中,我们经常会比较两个日期相差的天数,下面我们通过java方法判断两个日期所差的额天数. 具体内容,请看下面的代码: package com.jd.jr.fclient.test; imp ...

  7. java 计算当前日期所在的星期一到星期日

    public void mondayToSunday() {Date now = new Date();Date time = new Date(now.getYear(), now.getMonth ...

  8. Java计算出生一万天的纪念日期(错误演示,未解决)-----已经解决(原因计算long型数字未加L)

    改正的地方: 出问题的地方 正确代码: public class Test10000 { public static void main(String[] args) throws ParseExce ...

  9. java计算时间差 毫秒_java 获取两个日期相差的毫秒数

    方法一可以使用date的getTime()方法来将当前日期格式的时间转换为毫秒数,进而相减. long systime = new Date().getTime();//当前系统时间 long old ...

最新文章

  1. Cassandra 1.2 发布,NoSQL 数据库
  2. 分析Booking的150种机器学习模型,我总结了六条成功经验
  3. TensorRT是NVIDIA开发的深度学习推理工具,只支持推理,不支持训练 引
  4. (转自ITAA)个人问题汇总(workatlab)
  5. python grpc_python中grpc的使用示例
  6. 【期望】路径长度(金牌导航 期望-1)
  7. apollo配置中心搭建
  8. 转 Grub4Dos硬盘安装Fedora/CentOS Linux操作系统
  9. Cocos2d-x教程-多线程与异步加载
  10. FileUpload1.PostedFile.FileName取不到完整路径
  11. 软件测试工程师必须要了解的4个证书
  12. 自己组装nas服务器万兆,我用最便宜的方法,配了一套万兆 NAS
  13. windows基线加固
  14. python装饰器抽丝拨茧
  15. 树莓派家用NAS解决方案
  16. Kali从入门到出门-手记
  17. potplayer快捷键
  18. FusionCharts Free (FCF) V3 新特性之样式(Styles)
  19. epoll学习:思考一种高性能的服务器处理框架 - fanlb - 博客大巴
  20. freemaker 生成循环表格表格

热门文章

  1. Android 8.0 Car开发板读取U盘上的文件
  2. 感知器算法例题ppt_感知器算法.ppt
  3. HTML5画布椭圆形教程
  4. 步进电机与伺服电机基础知识
  5. MySql数据库的增删改查模糊查询
  6. iphone 计算机 桌面显示不出来,怎么将iphone屏幕显示在电脑上
  7. 解决nginx启动闪退
  8. Node.JS 获取时间戳(毫秒,秒)
  9. 先出报表还是先计提所得税_计提所得税是在结转损益前还是后
  10. python的一些帅气的代码,复制粘贴不好哦