200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > java计算当前日期后N个工作日的日期

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

时间:2020-02-21 15:42:32

相关推荐

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

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

WorkDayUtils如下:

package com.sqds.utils;import mons.lang.StringUtils;import java.text.SimpleDateFormat;import java.util.*;/*** 工作日计算工具类* Created by MJ·J on -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 节假日(日期格式:-01-01,-01-04,-01-05,......)* @param today 当前日期(日期格式:-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 = "-01-01,-01-04,-01-05,-01-06,-01-07,-01-08,-01-09,-01-10,-04-05,-04-06,-04-07,-05-01,-06-07,-06-08,-06-09,-09-13,-09-14,-09-15,-10-01,-10-02,-10-03,-10-04,-10-05,-10-06,-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 节假日(日期格式:-01-01,-01-04,-01-05,......)* @param today 当前日期(日期格式:-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 当前日期(日期格式:-01-01 08:08:08)* @param num需要设置的n个工作日* @return* @throws Exception*/public static String getWorkDayEnd( String today, int num) throws Exception {// 节假日String holidays = "-01-01,-01-04,-01-05,-01-06,-01-07,-01-08,-01-09,-01-10,-04-05,-04-06,-04-07,-05-01,-06-07,-06-08,-06-09,-09-13,-09-14,-09-15,-10-01,-10-02,-10-03,-10-04,-10-05,-10-06,-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 节假日(日期格式:-01-01,-01-04,-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 开始日期(日期格式:-01-01 08:08:08)* @param end 结束日期(日期格式:-01-01 08:08:08)* @return* @throws Exception*/public static long getTime(String start, String end) throws Exception {if (mons.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;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。