java 获取n个工作日后的日期(包含法定节假日、双休日、节后补班)

1.说明:

  获取n个工作日后的日期(包含法定节假日、双休日、节后补班),需要在数据库手动入库当年的法定节假日及节假日调休补班。(也可写在配置文件中读取)

2.工具类代码

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
* 用于查询n个工作日(包含法定节假日、双休日、调休)后的日期
* @author ywh
* @version 创建时间:2019年4月24日 下午5:50:29
*/
public class HolidayUtils {

	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

	/**
	 * 用于判断n个工作日(排除节假日、周六日包含节后补班数据)后的日期
	 *
	 * @author ywh
	 * @version 创建时间:2019年4月24日 上午11:24:58
	 * @param list 节假日数据源
	 * @param weekDayList 节后补班数据源
	 * @param today  计算开始时间
	 * @param num  多少个工作日 根据需要自行安排
	 * @return
	 * @throws ParseException
	 */
    @SuppressWarnings("deprecation")
	public static Date getScheduleActiveDate(List<String> list,List<String> weekDayList, Date today,int num) throws ParseException {
        String today1 = DateUtils.parseDate(today, "yyyy-MM-dd");
        Date tomorrow = null;
        int delay = 1;
        while(delay <= num){
            tomorrow = getTomorrow(today);
            //当前日期+1即tomorrow,判断是否是节假日,同时要判断是否是周末,都不是则将scheduleActiveDate日期+1,直到循环num次即可------不是节假日不是周末并且不是补班
            if((!isWeekend(sdf.format(tomorrow)) && !isHoliday(sdf.format(tomorrow),list))  || isWorkWeekDay(sdf.format(tomorrow),weekDayList)){
            	if(isWorkWeekDay(sdf.format(tomorrow),weekDayList)){
            		System.out.println(sdf.format(tomorrow) + "::是节假日调休补班");
            	}else{
            		System.out.println(sdf.format(tomorrow) + "::是正常工作日");
            	}
                delay++;
                today = tomorrow;
            }else if (isHoliday(sdf.format(tomorrow),list)){
//                tomorrow = getTomorrow(tomorrow);
                today = tomorrow;
                System.out.println(sdf.format(tomorrow) + "::是节假日");
            }else if(isWeekend(sdf.format(tomorrow))){//是周六日并且不是节后补班
            	if(!isWorkWeekDay(sdf.format(tomorrow),weekDayList)){
            		today = tomorrow;
                    System.out.println(sdf.format(tomorrow) + "::是休息日");
            	}

            }
        }
        System.out.println(today1+"后"+num+"个工作日后,日期为::" + sdf.format(today));
        return today;
    }

    /**
     * 获取明天的日期
    *
    * @author ywh
    * @version 创建时间:2019年4月23日 下午5:18:44
     */
    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;
    }

    /**
     * 判断是否是weekend
    *
    * @author ywh
    * @version 创建时间:2019年4月23日 下午5:19:27
     */
    public static boolean isWeekend(String sdate) throws ParseException {
        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;
        }
    }

    /**
     * 判断是否是holiday
    *
    * @author ywh
    * @version 创建时间:2019年4月23日 下午5:19:42
     */
    public static boolean isHoliday(String sdate, List<String> list) throws ParseException {
        if(list.size() > 0){
            for(int i = 0; i < list.size(); i++){
                if(sdate.equals(list.get(i))){
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 判断是否是补班
    *
    * @author ywh
    * @version 创建时间:2019年4月23日 下午5:19:54
     */
   public static boolean isWorkWeekDay(String sdate, List<String> list) throws ParseException {
       if(list.size() > 0){
           for(int i = 0; i < list.size(); i++){
               if(sdate.equals(list.get(i))){
                   return true;
               }
           }
       }
       return false;
   }

	/**
	 * 把日期格式化成字符串
	 * @param date
	 * @param format 例: yyyy-MM-dd
	 * @return
	 */
	public static String parseDate(Date date, String format) {
		SimpleDateFormat formater = new SimpleDateFormat(format);
		String dateString;
		dateString = formater.format(date);
		return dateString;
	}
}

3.测试调用

public String holiday(String date){
        Date today1 = new Date();
        int num = 10;//
        List<Holiday> holidayList = holidayService.queryAllHoliday("0");//查询出法定节假日list
        List<Holiday> weekDayList =holidayService.queryAllHoliday("1");//查询节假日调休补班list

        List hoList = new ArrayList();//节假日数据源
        List weList = new ArrayList();//节后节前数据源

        for (Holiday holiday : holidayList) {
            hoList.add(holiday.getDate());
        }
        for (Holiday holiday : weekDayList) {
            weList.add(holiday.getDate());
        }
        try {
            Date date111 = HolidayUtils.getScheduleActiveDate(hoList,weList,today1,num);
            System.out.println(HolidayUtils.parseDate(date111, "yyyy-MM-dd"));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return "";
    }

4.sql脚本

DROP TABLE IF EXISTS `holiday`;
CREATE TABLE `holiday` (
  `GUID` varchar(36) COLLATE utf8_bin NOT NULL,
  `DATE` varchar(10) COLLATE utf8_bin DEFAULT NULL,
  `TYPE` varchar(1) COLLATE utf8_bin DEFAULT NULL COMMENT ‘0:法定节假日;1 节假日调休补班(如某个节假日前后周六日上班的情况)‘,
  PRIMARY KEY (`GUID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=‘此表需每年根据法定节假日具体时间更新一次‘;

-- ----------------------------
-- Records of holiday
-- ----------------------------
INSERT INTO `holiday` VALUES (‘1‘, ‘2019-05-01‘, ‘0‘);
INSERT INTO `holiday` VALUES (‘10‘, ‘2019-09-15‘, ‘0‘);
INSERT INTO `holiday` VALUES (‘11‘, ‘2019-10-01‘, ‘0‘);
INSERT INTO `holiday` VALUES (‘12‘, ‘2019-10-02‘, ‘0‘);
INSERT INTO `holiday` VALUES (‘13‘, ‘2019-10-03‘, ‘0‘);
INSERT INTO `holiday` VALUES (‘14‘, ‘2019-10-04‘, ‘0‘);
INSERT INTO `holiday` VALUES (‘15‘, ‘2019-10-05‘, ‘0‘);
INSERT INTO `holiday` VALUES (‘16‘, ‘2019-10-06‘, ‘0‘);
INSERT INTO `holiday` VALUES (‘17‘, ‘2019-10-07‘, ‘0‘);
INSERT INTO `holiday` VALUES (‘18‘, ‘2019-04-28‘, ‘1‘);
INSERT INTO `holiday` VALUES (‘19‘, ‘2019-05-05‘, ‘1‘);
INSERT INTO `holiday` VALUES (‘2‘, ‘2019-05-02‘, ‘0‘);
INSERT INTO `holiday` VALUES (‘20‘, ‘2019-09-29‘, ‘1‘);
INSERT INTO `holiday` VALUES (‘21‘, ‘2019-10-12‘, ‘1‘);
INSERT INTO `holiday` VALUES (‘3‘, ‘2019-05-03‘, ‘0‘);
INSERT INTO `holiday` VALUES (‘4‘, ‘2019-05-04‘, ‘0‘);
INSERT INTO `holiday` VALUES (‘5‘, ‘2019-06-07‘, ‘0‘);
INSERT INTO `holiday` VALUES (‘6‘, ‘2019-06-08‘, ‘0‘);
INSERT INTO `holiday` VALUES (‘7‘, ‘2019-06-09‘, ‘0‘);
INSERT INTO `holiday` VALUES (‘8‘, ‘2019-09-13‘, ‘0‘);
INSERT INTO `holiday` VALUES (‘9‘, ‘2019-09-14‘, ‘0‘);

原文地址:https://www.cnblogs.com/irishua/p/11128326.html

时间: 2024-07-30 00:17:40

java 获取n个工作日后的日期(包含法定节假日、双休日、节后补班)的相关文章

java获取上周任意一天的日期

public static Date getDayOfWeek(int dayOfWeek,int weekOffset){ if(dayOfWeek>Calendar.SATURDAY || dayOfWeek<Calendar.SUNDAY){ return null; } Calendar date=Calendar.getInstance(Locale.CHINA); //将每周第一天设为星期一,默认是星期天 date.setFirstDayOfWeek(Calendar.MONDAY

[工作积累] NDK通过Java获取package name 和version

////////////////////////////////////////////////////////////////////////// //Java code snippet //get APK's versionCode in AndroidManifest.xml public int getVersionCode() { int versionCode = 1; try{ PackageInfo packageInfo = this.getPackageManager().g

java 获取昨天日期

java 获取昨天日期  取昨天的日期,本想的截出来日期减一就好了.又一想不对,如果今天是一号怎么办? 现有两个办法 1:Date as = new Date(new Date().getTime()-24*60*60*1000);  SimpleDateFormat matter1 = new SimpleDateFormat("yyyy-MM-dd");  String time = matter1.format(as);  System.out.println(time); 取出

Java 获取指定日期的方法总结 -转

格式化日期 String-->Date  或者 Data-->String SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");    Date  date = sdf.parse("2009-11-04");//String-->Date String  sdate  = sdf.format(date );// Data-->String ==================

Java日期时间API系列17-----Jdk8中java.time包中的新的日期时间API类,java日期计算4,2个日期对比,获取相差年月日部分属性和相差总的天时分秒毫秒纳秒等

通过Java日期时间API系列9-----Jdk8中java.time包中的新的日期时间API类的Period和Duration的区别 ,可以看出java8设计非常好,新增了Period和Duration类,专用于对比2个时间场景: Period,可以获取2个时间相差的年月日的属性. Duration,可以获取2个时间相差总的天时分秒毫秒纳秒. 下面应用: /** * 获取2个日期的相差年月天的年数部分 * @param startInclusive * @param endExclusive

Java -- 获取当前日期、当月月初日期、月末日期

Learn From:http://blog.csdn.net/sunhuwh/article/details/39161323 public class CalendarTest { public static void main(String[] args) { // 获取当前年份.月份.日期 Calendar cale = null; cale = Calendar.getInstance(); int year = cale.get(Calendar.YEAR); int month =

Java获取时间 时间计算 转换时间工具类

Java获取时间 时间计算 转换时间工具类 JAVA日期工具类 package com.mh.util; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * 时间日期转换工具类 */ public class DateTimeUtil { /** *

Java 连接池的工作原理(转)

原文:Java 连接池的工作原理 什么是连接? 连接,是我们的编程语言与数据库交互的一种方式.我们经常会听到这么一句话“数据库连接很昂贵“. 有人接受这种说法,却不知道它的真正含义.因此,下面我将解释它究竟是什么.[如果你已经知道了,你可以跳到它的工作原理部分] 创建连接的代码片段: String connUrl = "jdbc:mysql://your.database.domain/yourDBname"; Class.forName("com.mysql.jdbc.Dr

java学习第13天( java获取当前时间,有关大数据的运算及精确数字运算,Date类)

一 java获取当前时间 学习一个函数,得到当前时间的准确值 System.currectTimeMillis(). 可以得到以毫秒为单位的当前时间.它主要用于计算程序运行时间,long start=System.currectTimeMillis() ,long stop=System.currectTimeMillis() , stop-start; 二  有关大数据的运算及精确数字运算. 此时integer不适用.我们使用BigInteger ,如:BigInteger B= new Bi