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 createTime:2018年3月23日下午4:40:37
	 */
	public static List 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 dateList = new ArrayList();
	    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 list = new ArrayList();    
	    for (int i=0; i list = new ArrayList();    
	    for (int i=0; iarr[j]) {
                    temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
		return arr;
	}
	
	
	/**
	 * @Title: arrayToList 
	 * @Description: String[]数组转list集合
	 * @param str
	 * @return List
	 * @date createTime:2018年2月2日下午2:55:03
	 */
	public static List arrayToList(String[] str){
		return Arrays.asList(str);
	}
	
	
	/**
	 * @Title: arrayToList 
	 * @Description: Integer[]数组转list集合
	 * @param str
	 * @return List
	 * @date createTime:2018年2月2日下午2:56:48
	 */
	public static List 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 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 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 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 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

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

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
	 * @author lihaichao 
	 * @date createTime:2018年3月27日下午4:33:16
	 */
	@Transactional
	public static Map getAllDateOfYear(String year) throws ParseException{
		Map 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 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 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
	 * @date createTime:2018年3月27日上午11:36:04
	 */
	List 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 list);
	
	
	/**
	 * @Title: queryYearUtilByDayFormat 
	 * @Description: 根据day_format格式yyyy-MM-dd  查询该天数的数据
	 * @param day_format
	 * @return YearUtil
	 * @date createTime:2018年3月26日下午2:57:56
	 */
	List queryYearUtilByDayFormat(String day_format);
	
	/**
	 * @Title: queryYearUtilByYear 
	 * @Description: 根据年份查询数据
	 * @param year
	 * @return List
	 * @date createTime:2018年3月27日上午11:22:35
	 */
	List 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 queryYearUtilByDayFormat2(String day_format2);
}

YearUtilMapper.xml





	

	
	
		insert into sys_year_util (day_format,day_format2,year,month,day,week_id,quarter_id,holiday_status,status,remark) 
			values 
			
				(#{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})
			
	
	
	
	
	
	
	
	
	
	


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
	 * @date createTime:2018年3月27日上午11:47:34
	 */
	public List 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 list){
		return mapper.addYearUtil(list);
	}
	
	
	/**
	 * @Title: queryYearUtilByDayFormat 
	 * @Description: 根据day_format格式yyyy-MM-dd  查询该天数的数据
	 * @param day_format
	 * @return List
	 * @date createTime:2018年3月27日上午11:49:29
	 */
	public List queryYearUtilByDayFormat(String day_format){
		return mapper.queryYearUtilByDayFormat(day_format);
	}
	
	
	/**
	 * @Title: queryYearUtilByDayFormat2 
	 * @Description: 根据day_format2格式yyyy年MM月dd日  查询该天数的数据
	 * @param day_format2
	 * @return List
	 * @date createTime:2018年3月27日上午11:49:41
	 */
	public List queryYearUtilByDayFormat2(String day_format2){
		return mapper.queryYearUtilByDayFormat2(day_format2);
	}
	
	
	/**
	 * @Title: queryYearUtilByYear 
	 * @Description: 根据年份查询数据
	 * @param year
	 * @return List
	 * @date createTime:2018年3月27日上午11:50:16
	 */
	public List 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
	 * @date createTime:2018年3月27日上午11:56:56
	 */
	@RequestMapping(value="queryAllYearUtil",method={RequestMethod.GET,RequestMethod.POST})
	@ResponseBody
	public Map queryAllYearUtil(int year,String yearMonth,int status,int page,int limit){
		Map map=new HashMap<>();
		List list = service.queryAllYearUtil(year, yearMonth,status,(page-1)*limit, limit);
		List 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 addYearUtilData(String year) throws ParseException{
		return HolidayUtils.getAllDateOfYear(year);
	}
	
	
	/**
	 * @Title: queryYearUtilByDayFormat 
	 * @Description: 根据day_format格式yyyy-MM-dd  查询该天数的数据
	 * @param day_format
	 * @return List
	 * @date createTime:2018年3月27日下午1:46:26
	 */
	@RequestMapping(value="queryYearUtilByDayFormat",method={RequestMethod.GET,RequestMethod.POST})
	@ResponseBody
	public List queryYearUtilByDayFormat(String day_format){
		return service.queryYearUtilByDayFormat(day_format);
	}
	
	
	/**
	 * @Title: queryYearUtilByDayFormat2 
	 * @Description: 根据day_format2格式yyyy年MM月dd日  查询该天数的数据
	 * @param day_format2
	 * @return List
	 * @date createTime:2018年3月27日下午1:46:41
	 */
	@RequestMapping(value="queryYearUtilByDayFormat2",method={RequestMethod.GET,RequestMethod.POST})
	@ResponseBody
	public List queryYearUtilByDayFormat2(String day_format2){
		return service.queryYearUtilByDayFormat2(day_format2);
	}
	
	
	/**
	 * @Title: queryYearUtilByYear 
	 * @Description: 根据年份查询数据
	 * @param year
	 * @return List
	 * @date createTime:2018年3月27日下午1:46:53
	 */
	@RequestMapping(value="queryYearUtilByYear",method={RequestMethod.GET,RequestMethod.POST})
	@ResponseBody
	public List 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 省略

考勤规则设置
Java计算请假时长(根据规则设置去除节假日、休息日、特殊日期)_第1张图片

请假时长统计方法

@RequestMapping(value="countLeaveDuration",method={RequestMethod.POST,RequestMethod.GET})
	@ResponseBody
	public Map countLeaveDuration(@Param("startTime")String startTime,@Param("endTime")String endTime) throws ParseException{
		Map 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 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= 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

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

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

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

你可能感兴趣的:(java,java,请假系统,ssm)