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

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

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

ToolsUtils 工具类

package com.ys.utils;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;import org.apache.poi.ss.formula.functions.T;import com.ys.entity.Job;
import com.ys.entity.User;import io.netty.util.internal.EmptyArrays;/**
*@Title ToolsUtils.java
*@description:
*@time 创建时间:2018年2月2日 下午2:40:11
**/
public class ToolsUtils {static String jobIds="";static String jobIds1="";private ToolsUtils() {System.err.println("***********************");}/*** @Title: distinctArray * @Description: String[] 数字数组去重并转为Integer[]  适用于int数据* @param str* @return Integer[]* @date createTime:2018年2月2日下午2:52:00*/public static Integer[] distinctArray(String[] str){Integer[] arr = new Integer[str.length];for (int i = 0; i < arr.length; i++) {arr[i]=Integer.parseInt(str[i]);}List<Integer> list = new ArrayList<Integer>();    for (int i=0; i<arr.length; i++) {    if(!list.contains(arr[i])) {    list.add(arr[i]);    }    }return list.toArray(new Integer[list.size()]);}/*** @Title: distinctArray * @Description: Integer数组去重 适用于int数据* @param str* @return Integer[]* @date createTime:2018年2月28日下午3:12:28*/public static Integer[] distinctArray(Integer[] str){List<Integer> list = new ArrayList<Integer>();    for (int i=0; i<str.length; i++) {    if(!list.contains(str[i])) {    list.add(str[i]);    }    }return list.toArray(new Integer[list.size()]);}/*** @Title: orderByArray * @Description: 数组冒泡排序* @param arr* @return Integer[]* @date createTime:2018年2月2日下午3:52:24*/public static Integer[] bubbleSortArray(Integer[] arr){int temp=0;for(int i=0;i<arr.length;i++) {for(int j=i+1;j<arr.length;j++) {if(arr[i]>arr[j]) {temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}return arr;}/*** @Title: arrayToList * @Description: String[]数组转list集合* @param str* @return List<String>* @date createTime:2018年2月2日下午2:55:03*/public static List<String> arrayToList(String[] str){return Arrays.asList(str);}/*** @Title: arrayToList * @Description: Integer[]数组转list集合* @param str* @return List<Integer>* @date createTime:2018年2月2日下午2:56:48*/public static List<Integer> arrayToList(Integer[] str){return Arrays.asList(str);}/*** @Title: listToStringArray * @Description: list集合转String[]数组* @param list* @return String[]* @date createTime:2018年2月2日下午2:59:53*/public static String[] listToStringArray(List<T> list){return list.toArray(new String[list.size()]);}/*** @Title: listToIntegerArray * @Description: list集合转Integer[]数组* @param list* @return Integer[]* @date createTime:2018年2月2日下午3:00:19*/public static Integer[] listToIntegerArray(List<T> list){return list.toArray(new Integer[list.size()]);}/*** @Title: getUserIdForList * @Description: 获取用户表集合中的id拼接为字符串* @param list* @return String* @date createTime:2018年2月7日下午2:31:27*//*public static String getUserIdForList(List<User> list){String strId="";if(list.size()>0){for (int i = 0; i < list.size(); i++) {if(list.get(i).getUser_id()!=0){strId+=list.get(i).getUser_id()+",";if(list.get(i).getChildren().size()>0){getUserIdForList(list.get(i).getChildren());}}else{continue;}}}return strId;}*/public static void emptyString(){jobIds="";}public static String getJobIdForList(List<Job> list){if(list.size()>0){for (int i = 0; i < list.size(); i++) {if(list.get(i).getJob_id() !=0 ){jobIds+=list.get(i).getJob_id()+",";if(list.get(i).getChildren().size()>0){getJobIdForList(list.get(i).getChildren());}}else{continue;}}}return jobIds;}/*** @Title: getIndexForArray * @Description: 判断string数组中是否存在某个值  不存在返回-1  存在返回下标* @param @param arr* @param @param value* @param @return* @return int* @date createTime:2018年4月3日下午4:24:20*/public static int getIndexForArray(String[] arr,String value){int index=-1;for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);System.out.println((arr[i]==value)+"---"+(arr[i]==""+value+""));if(arr[i].equals(value)){index = i;break;}}return index;}/*** @Title: getIndexForArray * @Description: 判断Integer数组中是否存在某个值  不存在返回-1  存在返回下标* @param @param arr* @param @param value* @param @return* @return int* @date createTime:2018年4月3日下午4:25:44*/public static int getIndexForArray(Integer[] arr,Integer value){int index=0;for (int i = 0; i < arr.length; i++) {if(arr[i] == value){index = i;break;}}return index;}/*** @Title: getRandomString * @Description: 随机生成字符串* @param @param length 字符串长度* @return String* @date createTime:2018年4月9日下午1:45:52*/public static String getRandomString(int length){//产生随机数Random random=new Random();StringBuffer sb=new StringBuffer();//循环length次for(int i=0; i<length; i++){//产生0-2个随机数,既与a-z,A-Z,0-9三种可能int number=random.nextInt(3);long result=0;switch(number){//如果number产生的是数字0;case 0://产生A-Z的ASCII码result=Math.round(Math.random()*25+65);//将ASCII码转换成字符sb.append(String.valueOf((char)result));break;case 1://产生a-z的ASCII码result=Math.round(Math.random()*25+97);sb.append(String.valueOf((char)result));break;case 2://产生0-9的数字sb.append(String.valueOf(new Random().nextInt(10)));break; }}return sb.toString();}}

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

HolidayUtils.java

package com.ys.utils;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import javax.annotation.PostConstruct;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;import com.ys.entity.YearUtil;
import com.ys.service.YearUtilService;/**
*@Title HolidayUtils.java
*@description:  获取全年日期
*@author
*@time 创建时间:2018年3月26日 上午11:17:16
**/
@Component
public class HolidayUtils {@Autowiredprivate YearUtilService yuservice;private static HolidayUtils holidayUtils;@PostConstructpublic 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*/@Transactionalpublic 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;//idprivate String day_format;//yyyy-MM-ddprivate String day_format2;//yyyy年MM月dd日private int year;//yearprivate int month;//monthprivate int day;//dayprivate int week_id;//第几周private int quarter_id;//第几季度private String holiday_status;//工作日对应结果为 0, 休息日对应结果为 1, 节假日对应的结果为 2, 网站失效-1, 数据格式改变-2private int status;//statusprivate 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 {@Autowiredprivate 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 {@Autowiredprivate 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})@ResponseBodypublic 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@Transactionalpublic 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})@ResponseBodypublic 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})@ResponseBodypublic 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})@ResponseBodypublic 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;//statusprivate String remark;//remarkprivate 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})@ResponseBodypublic 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页面直接调用就好了。

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

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

  1. 【泛微表单】请假流程中计算请假时长(非系统自带考勤类型)

    请假流程计算请假时长 按一天8小时计算,日期为浏览按钮日期字段,时间为单选下拉框: <script> var beginTimeId = {id: "field22286&quo ...

  2. java 计算有效时长,有一时间段不计算时长

    java 计算有效时长,有一时间段不计算时长 计算时效性 计算 2020-08-07 10:10:23 到 2020-08-08 22:10:23 时间段内有多少小时,每天的01:00:00至06:0 ...

  3. JS实现请假时长计算(计算小时数差)

    给公司做了一套系统,涉及到请假单功能开发.在计算请假时长这块总结一下:按天计算的就不总结了比较简单,这里总结一下按小时数计算的 ,话不多说,直接上代码 // 获取两个日期相差的工作小时(不包括节假日) ...

  4. 请假时长计算和每月工作天数计算

    绪论 请假时长计算和每月工作天数计算其实六月份开发OA系统时就已经写出来了,只是一直没时间去整理,其实最近也很忙,毕竟年底要清一些开发任务.不过感觉自己今年博客写的太少了,所以这些日子基本每天都在加班 ...

  5. 计算有效时长的截止工作时间

    最近做项目有个需求,计算有效时长的结束时间,这个结束时间点必须落在工作时间段之内 废话不多说,上代码: 这里解释一下:getduration是主方法:传递四个参数,第一个当前时间,第二个有效时长,第三 ...

  6. java获取视频时长

    java获取视频时长 需要一个包,没有的找我要(java-1.0.2-1.0.2.jar) 一个可以通过视频的url地址或者是上传视频 文件有类型为(MultipartFile)的来获取视频的时长. ...

  7. java获取视频时长(实测可行)

    因为数据库视频表有一段时间丢失维护duration字段, 现在有需求需要用到此字段,只能再重新获取一遍, 更新表.哎!!! 先奉上 https://github.com/opensourceteams ...

  8. excel不显示0_【208期】根据身份证号计算退休年龄时长高亮提醒,EXCEL做到了

    导读 应亲们要求,以后会多上实例,今天给大家分享一期关于EXCEL根据身份证号以及退休年龄,动态自动计算距离到期年限,以及高亮提醒的实战案例. 实例要求: 根据身份证号以及退休年龄,用excel公式自 ...

  9. java web tcp长连接超时时间_常用java web容器http长连接超时设置

    1.http长连接相关知识 http长连接对我们来说并不陌生,但长连接并不是永远不会关闭.对于HTTP长连接需要注意下面几点:keepalive_timeout指的是web服务器发送完最后一个响应报文 ...

最新文章

  1. 广联达加密锁驱动_广联达(GGJ)安装教程
  2. VC6安装错误——Error Launching ......acmboot.exe
  3. 有了容器为什么kubernetes还需要Pod?
  4. 牛客网 2018年全国多校算法寒假训练营练习比赛(第五场) H.Tree Recovery-完全版线段树(区间更新、区间求和)...
  5. 16_使用开源项目下载文件
  6. 初探单点登录 SSO
  7. css模板 bulma_用Bulma在6分钟内学习CSS框架
  8. 数学建模常用模型算法学习(部分)
  9. php 解析lrc文件格式,前端LRC歌词解析播放插件
  10. 升级 XPLite 中的 IE
  11. druid加密数据库密码
  12. python画彩虹圈_javascript – 如何使用HTML5画布生成彩虹圈?
  13. HTML+CSS系列学习 第五篇
  14. PHP - Sessions
  15. vue中使用html5的drag实现任意位置拖动
  16. CSRFSSRF认识与了解
  17. 在 Java 9 的JShell中 跟Kotlin 的REPL中尽情体验函数式编程乐趣吧
  18. 从pdf文件中获取上市公司行业分类
  19. 清华数据结构重名剔除AC100
  20. 尾矿库山体滑坡安全监测 GNSS一体机

热门文章

  1. 在国内使用Google Voice通话及短信功能
  2. HP M1005可以扫描打印没反应的处理方法
  3. Dijkstra最短路径算法详细过程附C++详细代码
  4. 强力推荐的18种CSS命名和书写规范
  5. canoe教学_《美军生存手册》—划船基本知识:独木舟 基本技巧教学
  6. 我所理解的OpenSocial
  7. JVM原理优化及GC
  8. Qt编写地图综合应用42-离线轮廓图
  9. 区块链将是人类进化到数字世界的关键
  10. ISE14.7 使用Chipscope调试方法