版权声明:本文为博主原创文章,未经博主允许不得转载。 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页面直接调用就好了。
最终的时长会根据考勤规则的设置信息剔除休息日、工作日、特殊日期(必打卡&不必打卡日期),然后根据设置的一天的工时来计算请假时长。