Java计算请假时长(根据规则设置去除节假日、休息日、特殊日期)

首先选择的日期要判断是不是节假日;
这里是写了工具类获取全年的日期信息。

dateUtils工具类 某年第一天可以直接拼接 yyyy-01-01 获取节假日方法:

public class DateUtils {
public static final String goWeekURL= "http://api.goseek.cn/Tools/holiday?date=";//从公认网站上获取 节假日信息

//String转时间
	public static Date parseDate(String dateValue){
		SimpleDateFormat formatter = new SimpleDateFormat(date_format);
		try{
			Date date =  formatter.parse(dateValue);
			return date;
		}catch(Exception e){
			e.printStackTrace();
		}
		return null;
	}
	
	public static String getCurrentDateTime(String format){
		Date date=new Date();
	    DateFormat dateFormat = new SimpleDateFormat(format);
		String time = dateFormat.format(date);
		return time;
	}
	
	//获取当前时间
	public static Timestamp getTimestamp(){
		return new Timestamp(System.currentTimeMillis());
	}

/**
	 * @Title: getFirstDayOfYear 
	 * @Description: 获取某年的第一天
	 * @param year 年份
	 * @param pattern 返回值的格式 yyyy-MM-dd
	 * @throws ParseException
	 * @return String
	 * @date createTime:2018年3月26日上午11:24:54
	 */
	public static String getFirstDayOfYear(String year,String pattern) throws ParseException{
		SimpleDateFormat df=new SimpleDateFormat(pattern);
		Calendar calendar = Calendar.getInstance();  
        calendar.clear();  
        calendar.set(Calendar.YEAR, Integer.valueOf(year));  
        Date currYearFirst = calendar.getTime();  
        return df.format(currYearFirst);  
	}
	
	/**
	 * @Title: compareDate 
	 * @Description: 比较两个时间字符串大小
	 * @return boolean 
	 * @date 2017年8月18日下午4:26:40
	 */
	public static boolean compareDate(String date,String date1,String pattern) {
		boolean flag = true;
		SimpleDateFormat df = new SimpleDateFormat(pattern);
	        try {
	            Date dt = df.parse(date);
	            Date dt1= df.parse(date1);
	            if (dt.getTime() > dt1.getTime()) {
	                return flag=false;
	            } else if (dt.getTime() < dt1.getTime()) {
	                return flag=true;
	            }
	        } catch (Exception exception) {
	            exception.printStackTrace();
	        }
			return flag;
	    }
	
	/**
	 * @Title: timestampToString 
	 * @Description: Timestamp转String
	 * @return String 
	 * @date 2017年8月31日下午2:12:27
	 */
	public static String timestampToString(Timestamp timestamp,String pattern){
		SimpleDateFormat df = new SimpleDateFormat(pattern);
		return df.format(timestamp);
	}
	
	/**
	 * @Title: stringToTimestamp 
	 * @Description: String转Timestamp
	 * @return Timestamp 
	 * @date 2017年8月31日下午2:21:24
	 */
	public static Timestamp stringToTimestamp(String time){
		return Timestamp.valueOf(time);
	}
	
	/**
	 * @Title: getFirstDayOfYear 
	 * @Description: 获取某年的第一天
	 * @param year 年份
	 * @param pattern 返回值的格式 yyyy-MM-dd
	 * @throws ParseException
	 * @return String
	 * @date createTime:2018年3月26日上午11:24:54
	 */
	public static String getFirstDayOfYear(String year,String pattern) throws ParseException{
		SimpleDateFormat df=new SimpleDateFormat(pattern);
		Calendar calendar = Calendar.getInstance();  
        calendar.clear();  
        calendar.set(Calendar.YEAR, Integer.valueOf(year));  
        Date currYearFirst = calendar.getTime();  
        return df.format(currYearFirst);  
	}
	
	
	/**
	 * @Title: getLastDayOfYear 
	 * @Description: 获取某年的最后一天
	 * @param year 年份
	 * @param pattern 返回值的格式 yyyy-MM-dd
	 * @throws ParseException
	 * @return String
	 * @date createTime:2018年3月26日上午11:26:05
	 */
	public static String getLastDayOfYear(String year,String pattern) throws ParseException{
		SimpleDateFormat df=new SimpleDateFormat(pattern);
		Calendar calendar = Calendar.getInstance();  
        calendar.clear();  
        calendar.set(Calendar.YEAR, Integer.valueOf(year));  
        calendar.roll(Calendar.DAY_OF_YEAR, -1);  
        Date currYearLast = calendar.getTime();
        return df.format(currYearLast);  
	}
	
	
	/**
	 * @Title: getFirstDayOfMonth 
	 * @Description: 获取某月的第一天
	 * @param date
	 * @param pattern
	 * @throws ParseException
	 * @return String
	 * @date createTime:2018年3月17日上午11:35:09
	 */
	public static String getFirstDayOfMonth(String date,String pattern) throws ParseException{
		SimpleDateFormat df=new SimpleDateFormat(pattern);
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(df.parse(date));
		calendar.set(Calendar.DAY_OF_MONTH, 1);
		Date firstDayOfMonth = calendar.getTime();
		return df.format(firstDayOfMonth);
	}
	
	
	
	/**
	 * @Title: getlastDayOfMonth 
	 * @Description:  获取某月的最后一天
	 * @param date
	 * @param pattern
	 * @throws ParseException
	 * @return String
	 * @date createTime:2018年3月17日上午11:36:51
	 */
	public static String getLastDayOfMonth(String date,String pattern) throws ParseException{
		SimpleDateFormat df=new SimpleDateFormat(pattern);
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(df.parse(date));
		calendar.set(Calendar.DAY_OF_MONTH, 0);
		Date lastDayOfMonth = calendar.getTime();
		return df.format(lastDayOfMonth);
	}
	
	
	/**
	 * @Title: getWeek 
	 * @Description: 判断日期是本年份的第几周
	 * @param date yyyy-MM-dd
	 * @return int
	 * @date createTime:2018年3月26日下午2:04:01
	 */
	public static int getWeek(String date) {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        try {
            cal.setTime(format.parse(date));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return cal.get(Calendar.WEEK_OF_YEAR);
    }
	
	
	/**
	 * @Title: getQuarter 
	 * @Description: 获取日期所在的季度
	 * @param date
	 * @return int
	 * @date createTime:2018年3月26日下午2:27:27
	 */
	public static int getQuarter(String date) {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        try {
			cal.setTime(format.parse(date));
		} catch (ParseException e) {
			e.printStackTrace();
		}
        int month = cal.get(Calendar.MONTH) + 1;
        int Quarter=0;
        if(month>=1 && month<=3){
        	Quarter = 1;
        }else if(month>=4 && month<=6){
        	Quarter = 2;
        }else if(month>=7 && month<=9){
        	Quarter = 3;
        }else if(month>=10 && month<=12){
        	Quarter = 4;
        }
        return Quarter;
    }
	
	
	/**
	 * @Title: dateSplit 
	 * @Description: 获取两个日期范围内的所有日期
	 * @param startDate 开始时间
	 * @param endDate 结束时间
	 * @throws Exception
	 * @return List<Date>
	 * @date createTime:2018年3月23日下午4:40:37
	 */
	public static List<Date> dateSplit(String startDate, String endDate,String pattern)throws Exception {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
        Date start = sdf.parse(sdf.format(sdf1.parse(startDate)));
        Date end = sdf.parse(sdf.format(sdf1.parse(endDate)));
	    if (!start.before(end))
	        throw new Exception("开始时间应该在结束时间之后");
	    Long spi = end.getTime() - start.getTime();
	    Long step = spi / (24 * 60 * 60 * 1000);// 相隔天数
	    List<Date> dateList = new ArrayList<Date>();
	    dateList.add(end);
	    for (int i = 1; i <= step; i++) {
	        dateList.add(new Date(dateList.get(i - 1).getTime()
	                - (24 * 60 * 60 * 1000)));// 比上一天减一
	    }
	    return dateList;
	}
	
	
	
	/**
	 * @Title: getDayOfWeek 
	 * @Description: 获取当前日期是周几   
	 * @param date
	 * @return int 0~6 对应 周日-周六
	 * @date createTime:2018年3月23日下午4:59:40
	 */
	public static int getDayOfWeek(String date){
		SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance(); // 获得一个日历
        Date datet = null;
        try {
            datet = f.parse(date);
            cal.setTime(datet);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        int w = cal.get(Calendar.DAY_OF_WEEK) - 1; // 指示一个星期中的某天。
        if(w<0)w=0;
        return w;
	}
	
	
	/**
	 * @Title: conpareYear 
	 * @Description: 获取两个时间相差多少年
	 * @param @param start
	 * @param @param end
	 * @param @throws ParseException
	 * @return double
	 * @date createTime:2018年4月4日上午11:54:06
	 */
	public static int compareYear(String start,String end) throws ParseException{
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Calendar  from  =  Calendar.getInstance();
		from.setTime(sdf.parse(start));
		Calendar  to  =  Calendar.getInstance();
		to.setTime(sdf.parse(end));
		int fromYear = from.get(Calendar.YEAR);
		int toYear = to.get(Calendar.YEAR);
		int d_value=toYear-fromYear;
		return d_value;
	}
	
	
	
	/**
	 * @Title: getYearOfDate 
	 * @Description: 获取日期的年份
	 * @param date
	 * @return int
	 * @date createTime:2018年3月26日下午4:24:52
	 */
	public static int getYearOfDate(String date){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Calendar cal = Calendar.getInstance(); // 获得一个日历
		cal.clear();
		try {
			cal.setTime(sdf.parse(date));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return cal.get(Calendar.YEAR);
	}
	
	
	/**
	 * @Title: getMonthOfDate 
	 * @Description: 获取日期的月份
	 * @param date yyyy-MM-dd
	 * @return int
	 * @date createTime:2018年3月26日下午4:03:53
	 */
	public static int getMonthOfDate(String date){
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Calendar cal = Calendar.getInstance(); // 获得一个日历
		cal.clear();
		try {
			cal.setTime(sdf.parse(date));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return cal.get(Calendar.MONTH) + 1;
	}
	
	
	/**
	 * @Title: getDayOfDate 
	 * @Description: 获取日期的天数
	 * @param date
	 * @return int
	 * @date createTime:2018年3月26日下午4:29:00
	 */
	public static int getDayOfDate(String date){
		SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
		Calendar cal = Calendar.getInstance();  
		cal.clear();  
        try {
        	cal.setTime(df.parse(date));
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return cal.get(Calendar.DATE);
	}
	
	
	
	/**
	 * @Title: getHoliday 
	 * @Description: 获取工作日、节假日、休息日
	 * @param date  类型yyyy-MM-dd (将自动转为yyyyMMdd 否则会返回数据错误)
	 * @throws ParseException
	 * @return String 工作日对应结果为 0, 休息日对应结果为 1, 节假日对应的结果为 2, 网站失效-1, 数据格式改变-2
	 * @date createTime:2018年3月23日下午4:10:13
	 */
	public static String getHoliday(String date) throws ParseException{
		System.out.println(date);
		SimpleDateFormat df= new SimpleDateFormat("yyyyMMdd");
		SimpleDateFormat df1= new SimpleDateFormat("yyyy-MM-dd");
		String param = df.format(df1.parse(date));
		StringBuffer resultBuffer = null; 
		BufferedReader br = null;  
		URL url;
		try {
		url = new URL(goWeekURL+param);
		URLConnection con;
		try {
			//connection = (HttpURLConnection) urlTime.openConnection();//打开连接
			con = url.openConnection();
	        // 设置请求属性  
	        con.setRequestProperty("accept", "*/*");  
	        con.setRequestProperty("connection", "Keep-Alive");  
	        con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");  
	        con.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");  
	        // 建立连接  
	        con.connect();  
	        resultBuffer = new StringBuffer();  
	        br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));  
	        String temp;  
	        while ((temp = br.readLine()) != null) {  
	            resultBuffer.append(temp);  
	        }
	        if(resultBuffer.indexOf("data")!=-1){
		        return resultBuffer.substring(resultBuffer.length()-2,resultBuffer.length()-1);
	       }else{
	         return "-2";
	       }
		} catch (IOException e) {
			return "-1";
		}
		} catch (MalformedURLException e) {
			return "-1";
		}
		}
	
	
	/**
	 * @Title: TimeOperation
	 * @Description: 时间+-运算
	 * @param o(对象),type(时间类型:year,month...),format(时间格式:yyyy-MM-...),num(运算天数1,-1),resul_type(返回类型(java.util.Date)全类名)
	 * @return Object
	 * @date 2018年5月5日
	 */
	public static Object TimeOperation(Object o, String type, String format, int num, String result_type) {
		String[] oname = o.getClass().getName().split("\\.");
		SimpleDateFormat df = new SimpleDateFormat(format);
		Calendar calendar = new GregorianCalendar();
		if (oname[oname.length - 1].equalsIgnoreCase("String")) {
			String time = o.toString();
			Date date = null;
			try {
				date = df.parse(time);
			} catch (ParseException e) {
				e.printStackTrace();
			}
			calendar.setTime(date);
			return OperationResult(df, calendar, type, format, num, result_type);
		} else if (oname[oname.length - 1].equalsIgnoreCase("Date")) {
			if (oname[oname.length - 2].equalsIgnoreCase("util")) {
				calendar.setTime((Date) o);
			} else {
				calendar.setTime(new Date(((java.sql.Date) o).getTime()));
			}
			return OperationResult(df, calendar, type, format, num, result_type);
		} else if (oname[oname.length - 1].equalsIgnoreCase("TimeStamp")) {
			calendar.setTime((Timestamp) o);
			return OperationResult(df, calendar, type, format, num, result_type);
		}
		return null;
	}

	/**
	 * @Title: OperationResult
	 * @Description:返回时间+-运算结果
	 * @return Object
	 * @date 2018年5月5日
	 */
	public static Object OperationResult(SimpleDateFormat df, Calendar calendar, String type, String format, int num, String result_type) {
		// 判断运算时间类型 年月日
		if (type.equalsIgnoreCase("Year")) {
			calendar.add(Calendar.YEAR, num);
		} else if (type.equalsIgnoreCase("Month")) {
			calendar.add(Calendar.MONDAY, num);
		} else if (type.equalsIgnoreCase("Day")) {
			calendar.add(Calendar.DATE, num);
		} else if (type.equalsIgnoreCase("Hour")) {
			calendar.add(Calendar.HOUR, num);
		} else if (type.equalsIgnoreCase("Minute")) {
			calendar.add(Calendar.MINUTE, num);
		} else if (type.equalsIgnoreCase("Second")) {
			calendar.add(Calendar.SECOND, num);
		}
		// 输出结果
		String rt[] = result_type.split("\\.");
		if (rt[2].equalsIgnoreCase("String")) {
			return df.format(calendar.getTime());
		} else if (rt[2].equalsIgnoreCase("Date")) {
			if (rt[1].equalsIgnoreCase("util")) {
				return calendar.getTime();
			} else {
				return new java.sql.Date(calendar.getTime().getTime());
			}
		} else if (rt[2].equalsIgnoreCase("TimeStamp")) {
			return new Timestamp(calendar.getTimeInMillis());
		}
		return null;
	}
}

ToolsUtils 工具类

package com.ys.utils;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;

import org.apache.poi.ss.formula.functions.T;

import com.ys.entity.Job;
import com.ys.entity.User;

import io.netty.util.internal.EmptyArrays;

/** 
*@Title ToolsUtils.java 
*@description:  
*@time 创建时间:2018年2月2日 下午2:40:11 
**/
public class ToolsUtils {

	 static String jobIds="";
	 static String jobIds1="";
	
	private ToolsUtils() {
		System.err.println("***********************");
	}
	
	/**
	 * @Title: distinctArray 
	 * @Description: String[] 数字数组去重并转为Integer[]  适用于int数据
	 * @param str
	 * @return Integer[]
	 * @date createTime:2018年2月2日下午2:52:00
	 */
	public static Integer[] distinctArray(String[] str){
		Integer[] arr = new Integer[str.length];
		for (int i = 0; i < arr.length; i++) {
			arr[i]=Integer.parseInt(str[i]);
		}
		List<Integer> list = new ArrayList<Integer>();    
	    for (int i=0; i<arr.length; i++) {    
	        if(!list.contains(arr[i])) {    
	            list.add(arr[i]);    
	        }    
	    }
		return list.toArray(new Integer[list.size()]);
	}
	
	
	/**
	 * @Title: distinctArray 
	 * @Description: Integer数组去重 适用于int数据
	 * @param str
	 * @return Integer[]
	 * @date createTime:2018年2月28日下午3:12:28
	 */
	public static Integer[] distinctArray(Integer[] str){
		List<Integer> list = new ArrayList<Integer>();    
	    for (int i=0; i<str.length; i++) {    
	        if(!list.contains(str[i])) {    
	            list.add(str[i]);    
	        }    
	    }
		return list.toArray(new Integer[list.size()]);
	}
	
	
	/**
	 * @Title: orderByArray 
	 * @Description: 数组冒泡排序
	 * @param arr
	 * @return Integer[]
	 * @date createTime:2018年2月2日下午3:52:24
	 */
	public static Integer[] bubbleSortArray(Integer[] arr){
		int temp=0;
		for(int i=0;i<arr.length;i++) {
            for(int j=i+1;j<arr.length;j++) {
                if(arr[i]>arr[j]) {
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
		return arr;
	}
	
	
	/**
	 * @Title: arrayToList 
	 * @Description: String[]数组转list集合
	 * @param str
	 * @return List<String>
	 * @date createTime:2018年2月2日下午2:55:03
	 */
	public static List<String> arrayToList(String[] str){
		return Arrays.asList(str);
	}
	
	
	/**
	 * @Title: arrayToList 
	 * @Description: Integer[]数组转list集合
	 * @param str
	 * @return List<Integer>
	 * @date createTime:2018年2月2日下午2:56:48
	 */
	public static List<Integer> arrayToList(Integer[] str){
		return Arrays.asList(str);
	}
	
	
	/**
	 * @Title: listToStringArray 
	 * @Description: list集合转String[]数组
	 * @param list
	 * @return String[]
	 * @date createTime:2018年2月2日下午2:59:53
	 */
	public static String[] listToStringArray(List<T> list){
		return list.toArray(new String[list.size()]);
	}
	
	
	/**
	 * @Title: listToIntegerArray 
	 * @Description: list集合转Integer[]数组
	 * @param list
	 * @return Integer[]
	 * @date createTime:2018年2月2日下午3:00:19
	 */
	public static Integer[] listToIntegerArray(List<T> list){
		return list.toArray(new Integer[list.size()]);
	}
	
	
	/**
	 * @Title: getUserIdForList 
	 * @Description: 获取用户表集合中的id拼接为字符串
	 * @param list
	 * @return String
	 * @date createTime:2018年2月7日下午2:31:27
	 */
	/*public static String getUserIdForList(List<User> list){
		String strId="";
		if(list.size()>0){
			for (int i = 0; i < list.size(); i++) {
				if(list.get(i).getUser_id()!=0){
					strId+=list.get(i).getUser_id()+",";
					if(list.get(i).getChildren().size()>0){
						getUserIdForList(list.get(i).getChildren());
					}
				}else{
					continue;
				}
			}
		}
		return strId;
	}*/
	
	
	public static void emptyString(){
		jobIds="";
	}
	
	
	public static String getJobIdForList(List<Job> list){
		if(list.size()>0){
			for (int i = 0; i < list.size(); i++) {
				if(list.get(i).getJob_id() !=0 ){
					jobIds+=list.get(i).getJob_id()+",";
					if(list.get(i).getChildren().size()>0){
						getJobIdForList(list.get(i).getChildren());
					}
				}else{
					continue;
				}
			}
		}
		return jobIds;
	}
	
	
	
	/**
	 * @Title: getIndexForArray 
	 * @Description: 判断string数组中是否存在某个值  不存在返回-1  存在返回下标
	 * @param @param arr
	 * @param @param value
	 * @param @return
	 * @return int
	 * @date createTime:2018年4月3日下午4:24:20
	 */
	public static int getIndexForArray(String[] arr,String value){
		int index=-1;
		for (int i = 0; i < arr.length; i++) {
			System.out.println(arr[i]);
			System.out.println((arr[i]==value)+"---"+(arr[i]==""+value+""));
			if(arr[i].equals(value)){
				index = i;
				break;
			}
		}
		return index;
	}
	
	
	/**
	 * @Title: getIndexForArray 
	 * @Description: 判断Integer数组中是否存在某个值  不存在返回-1  存在返回下标
	 * @param @param arr
	 * @param @param value
	 * @param @return
	 * @return int
	 * @date createTime:2018年4月3日下午4:25:44
	 */
	public static int getIndexForArray(Integer[] arr,Integer value){
		int index=0;
		for (int i = 0; i < arr.length; i++) {
			if(arr[i] == value){
				index = i;
				break;
			}
		}
		return index;
	}

	
	/**
	 * @Title: getRandomString 
	 * @Description: 随机生成字符串
	 * @param @param length 字符串长度
	 * @return String
	 * @date createTime:2018年4月9日下午1:45:52
	 */
	public static String getRandomString(int length){
	    //产生随机数
	    Random random=new Random();
	    StringBuffer sb=new StringBuffer();
	    //循环length次
	    for(int i=0; i<length; i++){
	      //产生0-2个随机数,既与a-z,A-Z,0-9三种可能
	      int number=random.nextInt(3);
	      long result=0;
	      switch(number){
	      //如果number产生的是数字0;
	      case 0:
	        //产生A-Z的ASCII码
	        result=Math.round(Math.random()*25+65);
	        //将ASCII码转换成字符
	        sb.append(String.valueOf((char)result));
	        break;
	        case 1:
	          //产生a-z的ASCII码
	        result=Math.round(Math.random()*25+97);
	          sb.append(String.valueOf((char)result));
	        break;
	        case 2:
	          //产生0-9的数字
	                   sb.append(String.valueOf
	                          (new Random().nextInt(10)));
	        break; 
	      }
	    }
	    return sb.toString();
	  }
	
	
}

获取全年日期导入数据库表

HolidayUtils.java

package com.ys.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import com.ys.entity.YearUtil;
import com.ys.service.YearUtilService;

/** 
*@Title HolidayUtils.java 
*@description:  获取全年日期
*@author 
*@time 创建时间:2018年3月26日 上午11:17:16 
**/
@Component
public class HolidayUtils {

	@Autowired
	private YearUtilService yuservice;
	
	private static HolidayUtils holidayUtils;
	
	@PostConstruct
	public void init(){
		holidayUtils=this;
		holidayUtils.yuservice=this.yuservice;
	}
	
	/**
	 * @Title: getAllDateOfYear 
	 * @Description: 获取全年的日期假日信息导入到数据库表
	 * @param year
	 * @throws ParseException
	 * @return Map<String,Object>
	 * @author lihaichao 
	 * @date createTime:2018年3月27日下午4:33:16
	 */
	@Transactional
	public static Map<String,Object> getAllDateOfYear(String year) throws ParseException{
		Map<String,Object> map=new HashMap<>();
		SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd");
		SimpleDateFormat df1=new SimpleDateFormat("yyyy年MM月dd日");
		String start=DateUtils.getFirstDayOfYear(year, "yyyyMMdd");
		String end=DateUtils.getLastDayOfYear(year, "yyyyMMdd");
		List<Date> list=new ArrayList<>();
		try {
			list = DateUtils.dateSplit(start, end,"yyyyMMdd");
		} catch (Exception e) {
			map.put("status", "error");
			map.put("msg","获取年份日期数据错误!");
			e.printStackTrace();
			return map;
		}
		List<YearUtil> yuList=new ArrayList<>();
		for (int i = (list.size()-1); i >= 0 ; i--) {
			YearUtil yu=new YearUtil();
			String param=df.format(list.get(i));
			String param1=df1.format(list.get(i));
			String status=DateUtils.getHoliday(param);
			if(status=="-1"){
				try {
					map.put("status", "error");
					map.put("msg","获取节假日网站失效!");
					throw new Exception("获取节假日网站失效!");
				} catch (Exception e) {
					e.printStackTrace();
					return map;
				}
			}else if(status=="-2"){
				try {
					map.put("status", "error");
					map.put("msg","节假日返回数据的格式改变!");
					throw new Exception("节假日返回数据的格式改变!");
				} catch (Exception e) {
					e.printStackTrace();
					return map;
				}
			}
			yu.setDay_format(param);
			yu.setDay_format2(param1);
			yu.setYear(DateUtils.getYearOfDate(param));
			yu.setMonth(DateUtils.getMonthOfDate(param));
			yu.setDay(DateUtils.getDayOfDate(param));
			yu.setWeek_id(DateUtils.getWeek(param));
			yu.setQuarter_id(DateUtils.getQuarter(param));
			yu.setHoliday_status(status);
			yuList.add(yu);
		}
		if(yuList.size() == list.size()){
			int result=holidayUtils.yuservice.addYearUtil(yuList);
			if(result>0){
				map.put("status", "ok");
				map.put("msg","执行成功");
			}else{
				map.put("status", "error");
				map.put("msg","执行失败");
			}
		}else{
			try {
				map.put("status", "error");
				map.put("msg","数据条数不匹配!");
				throw new Exception("数据条数不匹配!");
			} catch (Exception e) {
				e.printStackTrace();
				return map;
			}
		}
		return map;
	}
}

实体类 YearUtil.java

public class YearUtil {

	private int id;//id
	private String day_format;//yyyy-MM-dd
	private String day_format2;//yyyy年MM月dd日
	private int year;//year
	private int month;//month
	private int day;//day
	private int week_id;//第几周
	private int quarter_id;//第几季度
	private String holiday_status;//工作日对应结果为 0, 休息日对应结果为 1, 节假日对应的结果为 2, 网站失效-1, 数据格式改变-2
	private int status;//status
	private String remark;//remark
}
	

YearUtilMapper.java

package com.ys.dao;

import java.util.List;

import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import com.ys.entity.YearUtil;

/** 
*@Title YearUtilMapper.java 
*@description:  年份日期
*@time 创建时间:2018年3月26日 下午2:56:03 
**/
@Repository
public interface YearUtilMapper {

	
	/**
	 * @Title: queryAllYearUtil 
	 * @Description: 查询所有日期  模糊查询分页
	 * @param year 年
	 * @param yearMonth 年月
	 * @param page
	 * @param limit
	 * @return List<YearUtil>
	 * @date createTime:2018年3月27日上午11:36:04
	 */
	List<YearUtil> queryAllYearUtil(@Param("year")int year,@Param("yearMonth")String yearMonth,@Param("status")int status,@Param("page")int page,@Param("limit")int limit);
	
	
	/**
	 * @Title: addYearUtil 
	 * @Description: 添加本年份数据
	 * @param yu
	 * @return int
	 * @date createTime:2018年3月26日下午2:59:18
	 */
	int addYearUtil(List<YearUtil> list);
	
	
	/**
	 * @Title: queryYearUtilByDayFormat 
	 * @Description: 根据day_format格式yyyy-MM-dd  查询该天数的数据
	 * @param day_format
	 * @return YearUtil
	 * @date createTime:2018年3月26日下午2:57:56
	 */
	List<YearUtil> queryYearUtilByDayFormat(String day_format);
	
	/**
	 * @Title: queryYearUtilByYear 
	 * @Description: 根据年份查询数据
	 * @param year
	 * @return List<YearUtil>
	 * @date createTime:2018年3月27日上午11:22:35
	 */
	List<YearUtil> queryYearUtilByYear(int year);
	
	/**
	 * @Title: queryYearUtilByDayFormat2 
	 * @Description: 根据day_format2格式yyyy年MM月dd日  查询该天数的数据
	 * @param day_format2
	 * @return YearUtil
	 * @date createTime:2018年3月26日下午2:58:43
	 */
	List<YearUtil> queryYearUtilByDayFormat2(String day_format2);
}

YearUtilMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >
<mapper namespace="com.ys.dao.YearUtilMapper">

	<select id="queryAllYearUtil" resultType="com.ys.entity.YearUtil">
		select * from sys_year_util
			<where>
				<if test=" year != 0 ">
					year=#{year}
				</if>
				<if test=" yearMonth != '' ">
					and DATE_FORMAT(day_format,'%Y-%m')=#{yearMonth}
				</if>
				<if test=" status != -1 ">
					and holiday_status=#{status}
				</if>
			</where>
				<if test=" limit != 0 ">
					limit #{page},#{limit}
				</if>
	</select>

	<!-- 添加年份的所有日期 -->
	<insert id="addYearUtil" parameterType="java.util.List">
		insert into sys_year_util (day_format,day_format2,year,month,day,week_id,quarter_id,holiday_status,status,remark) 
			values 
			<foreach collection="list" item="list" index="index" separator=",">
				(#{list.day_format},#{list.day_format2},#{list.year},#{list.month},#{list.day},#{list.week_id},#{list.quarter_id},
				#{list.holiday_status},#{list.status},#{list.remark})
			</foreach>
	</insert>
	
	<!-- 根据年份查询数据 -->
	<select id="queryYearUtilByYear" parameterType="java.lang.Integer" resultType="com.ys.entity.YearUtil">
		select * from sys_year_util where year=#{year}
	</select>
	
	<!-- 根据yyyy-MM-dd日期格式查询数据 -->
	<select id="queryYearUtilByDayFormat" parameterType="java.lang.String" resultType="com.ys.entity.YearUtil">
		select * from sys_year_util where day_format=#{day_format}
	</select>
	
	<!-- 根据yyyy年MM月dd日日期格式查询数据 -->
	<select id="queryYearUtilByDayFormat2" parameterType="java.lang.String" resultType="com.ys.entity.YearUtil">
		select * from sys_year_util where day_format2=#{day_format2}
	</select>
</mapper>

YearUtilService.java

package com.ys.service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ys.dao.YearUtilMapper;
import com.ys.entity.YearUtil;

/** 
*@Title YearUtilService.java 
*@description:   年份日期
*@time 创建时间:2018年3月26日 下午4:36:20 
**/
@Service
public class YearUtilService {

	@Autowired
	private YearUtilMapper mapper;
	
	
	/**
	 * @Title: queryAllYearUtil 
	 * @Description:  查询所有日期  模糊查询分页
	 * @param year
	 * @param yearMonth
	 * @param page
	 * @param limit
	 * @return List<YearUtil>
	 * @date createTime:2018年3月27日上午11:47:34
	 */
	public List<YearUtil> queryAllYearUtil(int year,String yearMonth,int status,int page,int limit){
		return mapper.queryAllYearUtil(year, yearMonth,status, page, limit);
	}
	
	
	/**
	 * @Title: addYearUtil 
	 * @Description: 添加本年份数据
	 * @param list
	 * @return int
	 * @date createTime:2018年3月27日上午11:47:41
	 */
	public int addYearUtil(List<YearUtil> list){
		return mapper.addYearUtil(list);
	}
	
	
	/**
	 * @Title: queryYearUtilByDayFormat 
	 * @Description: 根据day_format格式yyyy-MM-dd  查询该天数的数据
	 * @param day_format
	 * @return List<YearUtil>
	 * @date createTime:2018年3月27日上午11:49:29
	 */
	public List<YearUtil> queryYearUtilByDayFormat(String day_format){
		return mapper.queryYearUtilByDayFormat(day_format);
	}
	
	
	/**
	 * @Title: queryYearUtilByDayFormat2 
	 * @Description: 根据day_format2格式yyyy年MM月dd日  查询该天数的数据
	 * @param day_format2
	 * @return List<YearUtil>
	 * @date createTime:2018年3月27日上午11:49:41
	 */
	public List<YearUtil> queryYearUtilByDayFormat2(String day_format2){
		return mapper.queryYearUtilByDayFormat2(day_format2);
	}
	
	
	/**
	 * @Title: queryYearUtilByYear 
	 * @Description: 根据年份查询数据
	 * @param year
	 * @return List<YearUtil>
	 * @date createTime:2018年3月27日上午11:50:16
	 */
	public List<YearUtil> queryYearUtilByYear(int year){
		return mapper.queryYearUtilByYear(year);
	}
}

YearUtilController.java

package com.ys.controller;

import java.text.ParseException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.ys.entity.YearUtil;
import com.ys.service.YearUtilService;
import com.ys.utils.HolidayUtils;

/** 
*@Title YearUtilController.java 
*@description:  
*@time 创建时间:2018年3月27日 上午11:51:52 
**/
@Controller
public class YearUtilController {

	@Autowired
	private YearUtilService service;
	
	
	/**
	 * @Title: queryAllYearUtilListInput 
	 * @Description: 跳转到全年日期列表页
	 * @return String
	 * @date createTime:2018年3月27日下午1:49:00
	 */
	@RequestMapping(value="queryAllYearUtilListInput")
	public String queryAllYearUtilListInput(){
		return "yearUtil/queryAllYearUtilList";
	}
	
	
	/**
	 * @Title: queryAllYearUtil 
	 * @Description:  查询所有日期  模糊查询分页
	 * @param year
	 * @param yearMonth
	 * @param page
	 * @param limit
	 * @return Map<String,Object>
	 * @date createTime:2018年3月27日上午11:56:56
	 */
	@RequestMapping(value="queryAllYearUtil",method={RequestMethod.GET,RequestMethod.POST})
	@ResponseBody
	public Map<String,Object> queryAllYearUtil(int year,String yearMonth,int status,int page,int limit){
		Map<String,Object> map=new HashMap<>();
		List<YearUtil> list = service.queryAllYearUtil(year, yearMonth,status,(page-1)*limit, limit);
		List<YearUtil> listAll = service.queryAllYearUtil(year, yearMonth,status, 0, 0);
		if(list.size()>0){
			map.put("code", 0);
			map.put("msg","成功");
			map.put("count",listAll.size());
		}else{
			map.put("code", 0);
			map.put("msg","无数据");
			map.put("count",0);
		}
		map.put("data",list);
		return map;
	}
	
	
	/**
	 * @Title: addYearUtil 
	 * @Description: 添加本年份数据
	 * @param list
	 * @return int
	 * @throws ParseException 
	 * @date createTime:2018年3月27日下午1:46:14
	 */
	@RequestMapping(value="addYearUtilData",method={RequestMethod.GET,RequestMethod.POST})
	@ResponseBody
	@Transactional
	public Map<String,Object> addYearUtilData(String year) throws ParseException{
		return HolidayUtils.getAllDateOfYear(year);
	}
	
	
	/**
	 * @Title: queryYearUtilByDayFormat 
	 * @Description: 根据day_format格式yyyy-MM-dd  查询该天数的数据
	 * @param day_format
	 * @return List<YearUtil>
	 * @date createTime:2018年3月27日下午1:46:26
	 */
	@RequestMapping(value="queryYearUtilByDayFormat",method={RequestMethod.GET,RequestMethod.POST})
	@ResponseBody
	public List<YearUtil> queryYearUtilByDayFormat(String day_format){
		return service.queryYearUtilByDayFormat(day_format);
	}
	
	
	/**
	 * @Title: queryYearUtilByDayFormat2 
	 * @Description: 根据day_format2格式yyyy年MM月dd日  查询该天数的数据
	 * @param day_format2
	 * @return List<YearUtil>
	 * @date createTime:2018年3月27日下午1:46:41
	 */
	@RequestMapping(value="queryYearUtilByDayFormat2",method={RequestMethod.GET,RequestMethod.POST})
	@ResponseBody
	public List<YearUtil> queryYearUtilByDayFormat2(String day_format2){
		return service.queryYearUtilByDayFormat2(day_format2);
	}
	
	
	/**
	 * @Title: queryYearUtilByYear 
	 * @Description: 根据年份查询数据
	 * @param year
	 * @return List<YearUtil>
	 * @date createTime:2018年3月27日下午1:46:53
	 */
	@RequestMapping(value="queryYearUtilByYear",method={RequestMethod.GET,RequestMethod.POST})
	@ResponseBody
	public List<YearUtil> queryYearUtilByYear(int year){
		return service.queryYearUtilByYear(year);
	}
}

考勤规则表AttendanceRule.java

public class AttendanceRule {

	private int id;
	private String work_days;//工作日 
	private int auto_holidays;//节假日自动排休  0开启  1关闭  默认开启
	private int classes_id;//上班班次
	private String must_days;//必须打卡的日期
	private String not_must_days;//不必打卡的日期
	private int status;//status
	private String remark;//remark
	
	private String classes;//班次名称
	private Time amStart;//上午上班时间
	private Time amEnd;//上午下班时间
	private Time pmStart;//下午上班时间
	private Time pmEnd;//下午下班时间
	
}

工作班次时间表 WorkTime.java

public class WorkTime {

	private int id;//id 
	private String classes;//班次
	private Time amStart;//上午上班时间
	private Time amEnd;//上午下班时间
	private Time pmStart;//下午上班时间
	private Time pmEnd;//下午下班时间
	private Timestamp createTime;//创建时间

}

service/controller 省略

考勤规则设置
这里写图片描述

请假时长统计方法

@RequestMapping(value="countLeaveDuration",method={RequestMethod.POST,RequestMethod.GET})
	@ResponseBody
	public Map<String,Object> countLeaveDuration(@Param("startTime")String startTime,@Param("endTime")String endTime) throws ParseException{
		Map<String,Object> map=new HashMap<>();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		AttendanceRule ar=arservice.queryAttendanceRule();
		int duration = 0;
		int shangwu=0;
		int xiawu=0;
		int gongshi=0;
		if(ar!=null){
			String[] work_days=ar.getWork_days().split(",");//工作日 0-6 周日-周六 
			int auto_holidays=ar.getAuto_holidays();//是否排除节假日  0是 1否
			String amStart=ar.getAmStart().toString();//上午上班时间
			String amEnd=ar.getAmEnd().toString();//上午下班时间
			String pmStart=ar.getPmStart().toString();//下午上班时间
			String pmEnd=ar.getPmEnd().toString();//下午下班时间
			String[] must=ar.getMust_days().split(",");//必须打卡的日期
			String[] notMust=ar.getNot_must_days().split(",");//不必打卡的日期
			
			//一天的工作时长
			shangwu=(int) ((sdf.parse(startTime.substring(0,10)+" "+amEnd).getTime())-(sdf.parse(startTime.substring(0,10)+" "+amStart).getTime()));
			xiawu=(int) ((sdf.parse(startTime.substring(0,10)+" "+pmEnd).getTime())-(sdf.parse(startTime.substring(0,10)+" "+pmStart).getTime()));
			gongshi=shangwu+xiawu;
			if(startTime.substring(0,10).equals(endTime.substring(0,10))){//同一天
				if(auto_holidays==0){//节假日休班
					//(必打卡 || (工作日 && 不是节假日)&& 不是不必打卡)
					if((ToolsUtils.arrayToList(must).contains(startTime.substring(0,10)) || (ToolsUtils.arrayToList(work_days).contains(String.valueOf(DateUtils.getDayOfWeek(startTime.substring(0,10)))) && !(yuservice.queryYearUtilByDayFormat(startTime.substring(0, 10))).get(0).getHoliday_status().equals("2"))) && ToolsUtils.arrayToList(notMust).contains(startTime.substring(0,10))==false){
						//开始时间在上午上班前   结束时间在上午下班之前
						if(startTime.substring(11).compareTo(amStart)<=0 && endTime.substring(11).compareTo(amEnd)<=0 && endTime.substring(11).compareTo(amStart)>=0){ 
							duration=(int) ((sdf.parse(endTime).getTime())-(sdf.parse(startTime.substring(0,10)+" "+amStart).getTime()));
						//开始时间在上午上班前 && 结束时间在下午上班前
						}else if(startTime.substring(11).compareTo(amStart)<=0 && endTime.substring(11).compareTo(amEnd)>0 && endTime.substring(11).compareTo(pmStart)<=0){
							duration=(int) ((sdf.parse(endTime.substring(0,10)+" "+amEnd).getTime())-(sdf.parse(startTime.substring(0,10)+" "+amStart).getTime()));
						//开始时间在上午上班前 && 结束时间在下午下班前
						}else if(startTime.substring(11).compareTo(amStart)<=0 && endTime.substring(11).compareTo(pmStart)>0 && endTime.substring(11).compareTo(pmEnd)<=0){
							duration= (int) ((sdf.parse(startTime.substring(0,10)+" "+amEnd).getTime())-(sdf.parse(startTime.substring(0,10)+" "+amStart).getTime())+(sdf.parse(endTime).getTime())-(sdf.parse(startTime.substring(0,10)+" "+pmStart).getTime()));
						//开始时间在上午上班前 && 结束时间在下午下班之后
						}else if(startTime.substring(11).compareTo(amStart)<=0 && endTime.substring(11).compareTo(pmEnd)>0){
							duration=gongshi;
						//开始时间在上午上班内 && 结束时间在上午下班前
						}else if(startTime.substring(11).compareTo(amStart)>=0 && startTime.substring(11).compareTo(amEnd)<=0 && endTime.substring(11).compareTo(amEnd)<=0){
							duration=(int) ((sdf.parse(endTime).getTime())-(sdf.parse(startTime).getTime()));
						//开始时间在上午上班内 && 结束时间在中午
						}else if(startTime.substring(11).compareTo(amStart)>=0 && startTime.substring(11).compareTo(amEnd)<=0 && endTime.substring(11).compareTo(amEnd)>0 && endTime.substring(11).compareTo(pmStart)<=0){
							duration=(int) ((sdf.parse(startTime.substring(0,10)+" "+amEnd).getTime())-(sdf.parse(startTime).getTime()));
						//开始时间在上午上班内 && 结束时间在下午
						}else if(startTime.substring(11).compareTo(amStart)>=0 && startTime.substring(11).compareTo(amEnd)<=0 && endTime.substring(11).compareTo(pmStart)>0 && endTime.substring(11).compareTo(pmEnd)<=0){
							duration=(int) ((sdf.parse(startTime.substring(0,10)+" "+amEnd).getTime())-(sdf.parse(startTime).getTime())+(sdf.parse(endTime).getTime())-(sdf.parse(endTime.substring(0,10)+" "+pmStart).getTime()));
						//开始时间在上午上班内 && 结束时间在下午下班之后
						}else if(startTime.substring(11).compareTo(amStart)>=0 && startTime.substring(11).compareTo(amEnd)<=0 && endTime.substring(11).compareTo(pmEnd)>0){
							duration=(int) ((sdf.parse(startTime.substring(0,10)+" "+amEnd).getTime())-(sdf.parse(startTime).getTime())+(sdf.parse(endTime.substring(0,10)+" "+pmEnd).getTime())-(sdf.parse(endTime.substring(0,10)+" "+pmStart).getTime()));
						//开始时间在中午 && 结束时间在下午
						}else if(startTime.substring(11).compareTo(amEnd)>0 && startTime.substring(11).compareTo(pmStart)<=0 && endTime.substring(11).compareTo(pmStart)>0 && endTime.substring(11).compareTo(pmEnd)<=0){
							duration= (int) ((sdf.parse(endTime).getTime())-(sdf.parse(endTime.substring(0,10)+" "+pmStart).getTime()));
						//开始时间在中午 && 结束时间在下午下班之后
						}else if(startTime.substring(11).compareTo(amEnd)>0 && startTime.substring(11).compareTo(pmStart)<=0 && endTime.substring(11).compareTo(pmEnd)>0){
							duration=(int) ((sdf.parse(endTime.substring(0,10)+" "+pmEnd).getTime())-(sdf.parse(endTime.substring(0,10)+" "+pmStart).getTime()));
						//开始时间在下午 && 结束时间在下午
						}else if(startTime.substring(11).compareTo(pmStart)>0 && startTime.substring(11).compareTo(pmEnd)<=0 && endTime.substring(11).compareTo(pmEnd)<=0){
							duration=(int) ((sdf.parse(endTime).getTime())-(sdf.parse(startTime).getTime()));
						//开始时间在下午 && 结束时间在下午下班之后
						}else if(startTime.substring(11).compareTo(pmStart)>0 && startTime.substring(11).compareTo(pmEnd)<=0 && endTime.substring(11).compareTo(pmEnd)>0){
							duration=(int) ((sdf.parse(endTime.substring(0,10)+" "+pmEnd).getTime())-(sdf.parse(startTime).getTime()));
						//其他时间   都在上午上班前   ||  都在中午  ||  都在下午下班之后
						}else{
							duration=0;
						}
					}else{
						duration=0;
					}
				}else if(auto_holidays==1){ //不排除节假日
					//((必打卡 || 工作日 )&& 不是不必打卡)
					if((ToolsUtils.arrayToList(must).contains(startTime.substring(0,10)) || ToolsUtils.arrayToList(work_days).contains(String.valueOf(DateUtils.getDayOfWeek(startTime.substring(0,10))))) && ToolsUtils.arrayToList(notMust).contains(startTime.substring(0,10))==false){
						//开始时间在上午上班前   结束时间在上午下班之前
						if(startTime.substring(11).compareTo(amStart)<=0 && endTime.substring(11).compareTo(amEnd)<=0 && endTime.substring(11).compareTo(amStart)>=0){ 
							duration=(int) ((sdf.parse(endTime).getTime())-(sdf.parse(startTime.substring(0,10)+" "+amStart).getTime()));
						//开始时间在上午上班前 && 结束时间在下午上班前
						}else if(startTime.substring(11).compareTo(amStart)<=0 && endTime.substring(11).compareTo(amEnd)>0 && endTime.substring(11).compareTo(pmStart)<=0){
							duration=(int) ((sdf.parse(endTime.substring(0,10)+" "+amEnd).getTime())-(sdf.parse(startTime.substring(0,10)+" "+amStart).getTime()));
						//开始时间在上午上班前 && 结束时间在下午下班前
						}else if(startTime.substring(11).compareTo(amStart)<=0 && endTime.substring(11).compareTo(pmStart)>0 && endTime.substring(11).compareTo(pmEnd)<=0){
							duration= (int) ((sdf.parse(startTime.substring(0,10)+" "+amEnd).getTime())-(sdf.parse(startTime.substring(0,10)+" "+amStart).getTime())+(sdf.parse(endTime).getTime())-(sdf.parse(startTime.substring(0,10)+" "+pmStart).getTime()));
						//开始时间在上午上班前 && 结束时间在下午下班之后
						}else if(startTime.substring(11).compareTo(amStart)<=0 && endTime.substring(11).compareTo(pmEnd)>0){
							duration=gongshi;
						//开始时间在上午上班内 && 结束时间在上午下班前
						}else if(startTime.substring(11).compareTo(amStart)>=0 && startTime.substring(11).compareTo(amEnd)<=0 && endTime.substring(11).compareTo(amEnd)<=0){
							duration=(int) ((sdf.parse(endTime).getTime())-(sdf.parse(startTime).getTime()));
						//开始时间在上午上班内 && 结束时间在中午
						}else if(startTime.substring(11).compareTo(amStart)>=0 && startTime.substring(11).compareTo(amEnd)<=0 && endTime.substring(11).compareTo(amEnd)>0 && endTime.substring(11).compareTo(pmStart)<=0){
							duration=(int) ((sdf.parse(startTime.substring(0,10)+" "+amEnd).getTime())-(sdf.parse(startTime).getTime()));
						//开始时间在上午上班内 && 结束时间在下午
						}else if(startTime.substring(11).compareTo(amStart)>=0 && startTime.substring(11).compareTo(amEnd)<=0 && endTime.substring(11).compareTo(pmStart)>0 && endTime.substring(11).compareTo(pmEnd)<=0){
							duration=(int) ((sdf.parse(startTime.substring(0,10)+" "+amEnd).getTime())-(sdf.parse(startTime).getTime())+(sdf.parse(endTime).getTime())-(sdf.parse(endTime.substring(0,10)+" "+pmStart).getTime()));
						//开始时间在上午上班内 && 结束时间在下午下班之后
						}else if(startTime.substring(11).compareTo(amStart)>=0 && startTime.substring(11).compareTo(amEnd)<=0 && endTime.substring(11).compareTo(pmEnd)>0){
							duration=(int) ((sdf.parse(startTime.substring(0,10)+" "+amEnd).getTime())-(sdf.parse(startTime).getTime())+(sdf.parse(endTime.substring(0,10)+" "+pmEnd).getTime())-(sdf.parse(endTime.substring(0,10)+" "+pmStart).getTime()));
						//开始时间在中午 && 结束时间在下午
						}else if(startTime.substring(11).compareTo(amEnd)>0 && startTime.substring(11).compareTo(pmStart)<=0 && endTime.substring(11).compareTo(pmStart)>0 && endTime.substring(11).compareTo(pmEnd)<=0){
							duration= (int) ((sdf.parse(endTime).getTime())-(sdf.parse(endTime.substring(0,10)+" "+pmStart).getTime()));
						//开始时间在中午 && 结束时间在下午下班之后
						}else if(startTime.substring(11).compareTo(amEnd)>0 && startTime.substring(11).compareTo(pmStart)<=0 && endTime.substring(11).compareTo(pmEnd)>0){
							duration=(int) ((sdf.parse(endTime.substring(0,10)+" "+pmEnd).getTime())-(sdf.parse(endTime.substring(0,10)+" "+pmStart).getTime()));
						//开始时间在下午 && 结束时间在下午
						}else if(startTime.substring(11).compareTo(pmStart)>0 && startTime.substring(11).compareTo(pmEnd)<=0 && endTime.substring(11).compareTo(pmEnd)<=0){
							duration=(int) ((sdf.parse(endTime).getTime())-(sdf.parse(startTime).getTime()));
						//开始时间在下午 && 结束时间在下午下班之后
						}else if(startTime.substring(11).compareTo(pmStart)>0 && startTime.substring(11).compareTo(pmEnd)<=0 && endTime.substring(11).compareTo(pmEnd)>0){
							duration=(int) ((sdf.parse(endTime.substring(0,10)+" "+pmEnd).getTime())-(sdf.parse(startTime).getTime()));
						//其他时间   都在上午上班前   ||  都在中午  ||  都在下午下班之后
						}else{
							duration=0;
						}
					}else{
						duration=0;
					}
				}
			}else{//跨天
				List<Date> list = new ArrayList<>();
				try {
					list = DateUtils.dateSplit(startTime.substring(0, 10), endTime.substring(0, 10),"yyyyMMdd");
				} catch (Exception e) {
					e.printStackTrace();
				}
				if(auto_holidays == 0){//节假日休班
					for (int i = list.size()-1; i >= 0; i--) {
						if(i==(list.size()-1)){
							//(必打卡 || (工作日 && 不是节假日)&& 不是不必打卡)
							if((ToolsUtils.arrayToList(must).contains(sdf.format(list.get(i)).substring(0, 10)) || (ToolsUtils.arrayToList(work_days).contains(String.valueOf(DateUtils.getDayOfWeek(sdf.format(list.get(i)).substring(0, 10)))) && !(yuservice.queryYearUtilByDayFormat(sdf.format(list.get(i)).substring(0, 10))).get(0).getHoliday_status().equals("2"))) && ToolsUtils.arrayToList(notMust).contains(sdf.format(list.get(i)).substring(0,10))==false){
								//开始在上午上班之前
								if(startTime.substring(11).compareTo(amStart)<=0){
									duration+=gongshi;
								//开始在上午上班
								}else if(startTime.substring(11).compareTo(amStart)>0 && startTime.substring(11).compareTo(amEnd)<=0){
									duration+=(gongshi-(sdf.parse(startTime).getTime()-sdf.parse(startTime.substring(0,10)+" "+amStart).getTime()));
								//开始在中午
								}else if(startTime.substring(11).compareTo(amEnd)>0 && startTime.substring(11).compareTo(pmStart)<=0){
									duration+=xiawu;
								//开始在下午上班
								}else if(startTime.substring(11).compareTo(pmStart)>0 && startTime.substring(11).compareTo(pmEnd)<=0){
									duration+=(sdf.parse(startTime.substring(0,10)+" "+pmEnd).getTime()-sdf.parse(startTime).getTime());
								//开始在下午下班之后
								}else if(startTime.substring(11).compareTo(pmEnd)>0){
									duration+=0;
								}
							}else{
								duration+=0;
							}
						//结束当天
						}else if(i==0){
							//(必打卡 || (工作日 && 不是节假日)&& 不是不必打卡)
							if((ToolsUtils.arrayToList(must).contains(sdf.format(list.get(i)).substring(0, 10)) || (ToolsUtils.arrayToList(work_days).contains(String.valueOf(DateUtils.getDayOfWeek(sdf.format(list.get(i)).substring(0, 10)))) && !(yuservice.queryYearUtilByDayFormat(sdf.format(list.get(i)).substring(0, 10))).get(0).getHoliday_status().equals("2"))) && ToolsUtils.arrayToList(notMust).contains(sdf.format(list.get(i)).substring(0,10))==false){
								//结束在上午上班之前
								if(endTime.substring(11).compareTo(amStart)<=0){
									duration+=0;
								//结束在上午上班
								}else if(endTime.substring(11).compareTo(amStart)>0 && endTime.substring(11).compareTo(amEnd)<=0){
									duration+=(sdf.parse(endTime).getTime()-sdf.parse(endTime.substring(0,10)+" "+amStart).getTime());
								//结束在中午
								}else if(endTime.substring(11).compareTo(amEnd)>0 && endTime.substring(11).compareTo(pmStart)<=0){
									duration+=shangwu;
								//结束在下午上班
								}else if(endTime.substring(11).compareTo(pmStart)>0 && endTime.substring(11).compareTo(pmEnd)<=0){
									duration+=(gongshi-(sdf.parse(endTime.substring(0,10)+" "+pmEnd).getTime()-sdf.parse(endTime).getTime()));
								}else if(endTime.substring(11).compareTo(pmEnd)>0){
									duration+=gongshi;
								}
							}else{
								duration+=0;
							}
						//日期期间
						}else if(0<i && i<(list.size()-1)){
							//(必打卡 || (工作日 && 不是节假日)&& 不是不必打卡)
							if((ToolsUtils.arrayToList(must).contains(sdf.format(list.get(i)).substring(0, 10)) || (ToolsUtils.arrayToList(work_days).contains(String.valueOf(DateUtils.getDayOfWeek(sdf.format(list.get(i)).substring(0, 10)))) && !(yuservice.queryYearUtilByDayFormat(sdf.format(list.get(i)).substring(0, 10))).get(0).getHoliday_status().equals("2")))  && ToolsUtils.arrayToList(notMust).contains(sdf.format(list.get(i)).substring(0,10))==false){
								duration+=1*gongshi;
							}else{
								duration+=0;
							}
						}
					}
				}else{//不考虑节假日
					for (int i = list.size()-1; i >= 0; i--) {
						if(i == (list.size()-1)){//开始当天
							//((必打卡 || 工作日)&& 不是不必打卡日期)
							if((ToolsUtils.arrayToList(must).contains(sdf.format(list.get(i)).substring(0, 10)) || ToolsUtils.arrayToList(work_days).contains(String.valueOf(DateUtils.getDayOfWeek(sdf.format(list.get(i)).substring(0, 10))))) && ToolsUtils.arrayToList(notMust).contains(sdf.format(list.get(i)).substring(0,10))==false){
								//开始在上午上班之前
								if(startTime.substring(11).compareTo(amStart)<=0){
									duration+=gongshi;
								//开始在上午上班
								}else if(startTime.substring(11).compareTo(amStart)>0 && startTime.substring(11).compareTo(amEnd)<=0){
									duration+=(gongshi-(sdf.parse(startTime).getTime()-sdf.parse(startTime.substring(0,10)+" "+amStart).getTime()));
								//开始在中午
								}else if(startTime.substring(11).compareTo(amEnd)>0 && startTime.substring(11).compareTo(pmStart)<=0){
									duration+=xiawu;
								//开始在下午上班
								}else if(startTime.substring(11).compareTo(pmStart)>0 && startTime.substring(11).compareTo(pmEnd)<=0){
									duration+=(sdf.parse(startTime.substring(0,10)+" "+pmEnd).getTime()-sdf.parse(startTime).getTime());
								//开始在下午下班之后
								}else if(startTime.substring(11).compareTo(pmEnd)>0){
									duration+=0;
								}
							}else{
								duration+=0;
							}
						}else if(i == 0){//结束当天
							//((必打卡 || 工作日)&& 不是不必打卡日期)
							if((ToolsUtils.arrayToList(must).contains(sdf.format(list.get(i)).substring(0, 10)) || ToolsUtils.arrayToList(work_days).contains(String.valueOf(DateUtils.getDayOfWeek(sdf.format(list.get(i)).substring(0, 10))))) && ToolsUtils.arrayToList(notMust).contains(sdf.format(list.get(i)).substring(0,10))==false){
								//结束在上午上班之前
								if(endTime.substring(11).compareTo(amStart)<=0){
									duration+=0;
								//结束在上午上班
								}else if(endTime.substring(11).compareTo(amStart)>0 && endTime.substring(11).compareTo(amEnd)<=0){
									duration+=(sdf.parse(endTime).getTime()-sdf.parse(endTime.substring(0,10)+" "+amStart).getTime());
								//结束在中午
								}else if(endTime.substring(11).compareTo(amEnd)>0 && endTime.substring(11).compareTo(pmStart)<=0){
									duration+=shangwu;
								//结束在下午上班
								}else if(endTime.substring(11).compareTo(pmStart)>0 && endTime.substring(11).compareTo(pmEnd)<=0){
									duration+=(gongshi-(sdf.parse(endTime.substring(0,10)+" "+pmEnd).getTime()-sdf.parse(endTime).getTime()));
								}else if(endTime.substring(11).compareTo(pmEnd)>0){
									duration+=gongshi;
								}
							}else{
								duration+=0;
							}
						}else if(0<i && i<(list.size()-1)){//日期期间
							//((必打卡 || 工作日)&& 不是不必打卡日期)
							if((ToolsUtils.arrayToList(must).contains(sdf.format(list.get(i)).substring(0, 10)) || ToolsUtils.arrayToList(work_days).contains(String.valueOf(DateUtils.getDayOfWeek(sdf.format(list.get(i)).substring(0, 10))))) && ToolsUtils.arrayToList(notMust).contains(sdf.format(list.get(i)).substring(0,10))==false){
								duration+=1*gongshi;
							}else{
								duration+=0;
							}
						}
					}
				}
			}
			map.put("status", "success");
			map.put("duration", new DecimalFormat("0.00").format((float)duration/gongshi));
		}else{
			map.put("status", "error");
			map.put("duration", new DecimalFormat("0.00").format((float)duration/gongshi));
			try {
				throw new Exception("考勤规则未设置!");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return map;
	}

方法注释很详细,就不再赘述了。

在JSP页面直接调用就好了。

最终的时长会根据考勤规则的设置信息剔除休息日、工作日、特殊日期(必打卡&不必打卡日期),然后根据设置的一天的工时来计算请假时长。

  • 9
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
您好!对于计算请假时长,除去节假日和周末的情况,可以按照以下步骤进行计算: 1. 首先,确定请假的起始日期和结束日期。 2. 使用Java中的日期类(如java.util.Date或java.time.LocalDate)来表示日期。 3. 使用Calendar类或LocalDate类来处理日期的加减运算和判断是否为周末。 4. 遍历请假期间的每一天,判断是否为周末或节假日,如果是则跳过计算。 5. 计算剩余的有效请假天数。 以下是一个简单的示例代码,用于计算请假时长并排除节假日和周末: ```java import java.time.DayOfWeek; import java.time.LocalDate; public class LeaveCalculator { public static void main(String[] args) { LocalDate startDate = LocalDate.of(2022, 9, 1); LocalDate endDate = LocalDate.of(2022, 9, 10); int leaveDays = calculateLeaveDays(startDate, endDate); System.out.println("有效请假天数:" + leaveDays); } public static int calculateLeaveDays(LocalDate startDate, LocalDate endDate) { int leaveDays = 0; LocalDate currentDate = startDate; while (currentDate.isBefore(endDate) || currentDate.isEqual(endDate)) { if (currentDate.getDayOfWeek() != DayOfWeek.SATURDAY && currentDate.getDayOfWeek() != DayOfWeek.SUNDAY) { // 判断是否为节假日,如果是则跳过计算 if (!isHoliday(currentDate)) { leaveDays++; } } currentDate = currentDate.plusDays(1); } return leaveDays; } public static boolean isHoliday(LocalDate date) { // 判断是否为节假日的逻辑,根据实际情况进行实现 // 如果需要判断多个节假日,可以使用switch语句或if-else语句来判断 // 返回true表示是节假日,返回false表示不是节假日 return false; } } ``` 上述代码中,我们使用`calculateLeaveDays`方法来计算有效请假天数,通过遍历请假期间的每一天,并根据周末和节假日的判断来累计有效请假天数。`isHoliday`方法用于判断是否为节假日,您可以根据实际情况来实现该方法。 希望这个示例能对您有所帮助!如有任何问题,请随时提问。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值