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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36476972/article/details/79747247

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

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

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


/**
     * @Title: getFirstDayOfYear 
     * @Description: 获取某年的第一天
     * @param year 年份
     * @param pattern 返回值的格式 yyyy-MM-dd
     * @throws ParseException
     * @return String
     * @author lihaichao 
     * @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
     * @author lihaichao 
     * @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: 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";
        }
        }
}

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

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页面直接调用就好了。

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

猜你喜欢

转载自blog.csdn.net/qq_36476972/article/details/79747247