java法定假日_Java 排除法定节假日、周六日以及工作日午休,计算两个Date相差的时间...

packagecom.hnzie.modules.kaoqin.service.impl;importcom.baomidou.mybatisplus.service.impl.ServiceImpl;importcom.hnzie.modules.kaoqin.dao.WxUserHolidayDao;importcom.hnzie.modules.kaoqin.entity.WxUserHolidayEntity;importcom.hnzie.modules.kaoqin.service.WxQingjiaMaintainService;importcom.hnzie.modules.kaoqin.service.WxUserHolidayService;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;importjava.text.DateFormat;importjava.text.SimpleDateFormat;import java.util.*;

@Service("wxUserHolidayService")

@Slf4jpublic class WxUserHolidayServiceImpl extends ServiceImpl implementsWxUserHolidayService {/*** 定义常见的时间格式*/

private static String[] dateFormat ={"yyyy-MM-dd HH:mm:ss", //0

"yyyy/MM/dd HH:mm:ss", //1

"yyyy年MM月dd日HH时mm分ss秒", //2

"yyyy-MM-dd", //3

"yyyy/MM/dd", //4

"yy-MM-dd", //5

"yy/MM/dd", //6

"yyyy年MM月dd日", //7

"HH:mm:ss", //8

"yyyyMMddHHmmss", //9

"yyyyMMdd", //10

"yyyy.MM.dd", //11

"yy.MM.dd", //12

"MM月dd日HH时mm分", //13

"yyyy年MM月dd日 HH:mm:ss", //14

"yyyy-MM-dd HH:mm", //15

"yyMMdd" //16

};

@OverridepublicString[] holiday1() {returnbaseMapper.selectLawHolidayDate();

}

@OverridepublicString[] holiday2() {returnbaseMapper.selectLawWorkDate();

}

@OverridepublicString[] workTimes() {

String S = baseMapper.selectTimeTable(Const.timeTableKey);

Map parse = (Map)JSON.parse(S);

String[] times = new String[4];

times[0] = String.valueOf(parse.get("SstartTime"));

times[1] = String.valueOf(parse.get("SendTime"));

times[2] = String.valueOf(parse.get("XstartTime"));

times[3] = String.valueOf(parse.get("XendTime"));

return times;}

@Overridepublic doublecalculationTime(String startTime, String endTime) {//获取startTime和endTime之间的所有日期,去掉周六周日

List list = this.getDates(startTime, endTime);//获取法定节假日

List fdList = this.holiday(1);//获取调休

List txList = this.holiday(2);//上班时间

String[] workTime = this.workTime();

String[] split= workTime[2].split(":");

String[] split1= workTime[1].split(":");//午休时间

int wxTime = (Integer.valueOf(split[0]) - Integer.valueOf(split1[0])) * 60;//删除时间区间中的所有法定节假日

list.removeAll(fdList);

DateFormat df= new SimpleDateFormat(dateFormat[3]);

String st=startTime.substring(0, 10);

String en=endTime.substring(0, 10);try{

Date sts=df.parse(startTime.substring(0, 10));

Date ens=df.parse(endTime.substring(0, 10));for(String s : txList) {

Date ss=df.parse(s);if ((ss.before(ens) && ss.after(sts)) || ss.equals(sts) ||ss.equals(ens)) {//添加时间区间中的所有调休日期

list.add(s);

}

}

}catch(Exception e){

e.printStackTrace();

}//去重

list = this.removal(list);//开始当天上午上班时间、上午下班时间、下午上班时间、下午下班时间

String amWorkYes = startTime.substring(0, 11) + workTime[0];

String amWorkNo= startTime.substring(0, 11) + workTime[1];

String pmWorkYes= startTime.substring(0, 11) + workTime[2];

String pmWorkNo= startTime.substring(0, 11) + workTime[3];//结束当天上午上班时间、上午下班时间、下午上班时间、下午下班时间

String amWorkYesEnd = endTime.substring(0, 11) + workTime[0];

String amWorkNoEnd= endTime.substring(0, 11) + workTime[1];

String pmWorkYesEnd= endTime.substring(0, 11) + workTime[2];

String pmWorkNoEnd= endTime.substring(0, 11) + workTime[3];double time = 0;if (list.size() == 0) {//申请日期是法定节假日

returntime;

}else if (list.size() == 1) {//请假一天

if (startTime.compareTo(pmWorkNo) > 0) {returntime;

}if (endTime.compareTo(amWorkYes) < 0) {returntime;

}if (startTime.compareTo(amWorkNo) >= 0 && endTime.compareTo(pmWorkYes) <= 0) {returntime;

}//开始时间小于上午上班时间,开始时间等于上午上班时间

if (startTime.compareTo(amWorkYes) < 0) {

startTime=amWorkYes;

}//结束时间大于下午下班时间,结束时间等于下午下班时间

if (endTime.compareTo(pmWorkNo) > 0) {

endTime=pmWorkNo;

}//开始时间大于上午下班时间,小于下午上班时间,开始时间等于下午上班时间

if (startTime.compareTo(amWorkNo) >= 0 && startTime.compareTo(pmWorkYes) <= 0) {

startTime=pmWorkYes;

}//结束时间大于上午下班时间,小于下午上班时间,结束时间等于上午下班时间

if (endTime.compareTo(amWorkNo) >= 0 && endTime.compareTo(pmWorkYes) <= 0) {

endTime=amWorkNo;

}

Date start= this.StringToDate(startTime, 15); //0或者15

Date end = this.StringToDate(endTime, 15);//三种情况,1:请假时间全在上午,2:请假时间全在下午,3:包含午休时间

if (startTime.compareTo(amWorkYes) >= 0 && endTime.compareTo(amWorkNo) <= 0) {double minute = (end.getTime() - start.getTime()) / (1000 * 60);

time= minute / (8 * 60);

}else if (startTime.compareTo(pmWorkYes) >= 0 && endTime.compareTo(pmWorkNo) <= 0) {double minute = (end.getTime() - start.getTime()) / (1000 * 60);

time= minute / (8 * 60);

}else if (startTime.compareTo(amWorkNo) < 0 && endTime.compareTo(pmWorkYes) > 0) {double minute = (end.getTime() - start.getTime()) / (1000 * 60) -wxTime;

time= minute / (8 * 60);

}returntime;

}else{//处理请假多天的情况//申请开始时间处理

if(list.contains(st)) {if (startTime.compareTo(amWorkYes) < 0) {

startTime=amWorkYes;

}if (startTime.compareTo(pmWorkNo) > 0) {

startTime=pmWorkNo;

}if (startTime.compareTo(amWorkNo) >= 0 && startTime.compareTo(pmWorkYes) <= 0) {

startTime=pmWorkYes;

}

Date start= this.StringToDate(startTime, 15); //0或者15

Date end = this.StringToDate(pmWorkNo, 15);if (startTime.compareTo(amWorkNo) < 0) {//减去中午一小时

double t = (end.getTime() - start.getTime()) / (1000 * 60) -wxTime;

time= time + t / (8 * 60);

}else{double t = (end.getTime() - start.getTime()) / (1000 * 60);

time= time + t / (8 * 60);

}

list.remove(st);

}//申请结束时间处理

if(list.contains(en)) {if (endTime.compareTo(amWorkYesEnd) < 0) {

endTime=amWorkYesEnd;

}if (endTime.compareTo(pmWorkNoEnd) > 0) {

endTime=pmWorkNoEnd;

}if (endTime.compareTo(amWorkNoEnd) >= 0 && endTime.compareTo(pmWorkYesEnd) <= 0) {

endTime=amWorkNoEnd;

}

Date end= this.StringToDate(endTime, 15);//0或者15

Date start = this.StringToDate(amWorkYesEnd, 15);if (endTime.compareTo(pmWorkYesEnd) > 0) {double t = (end.getTime() - start.getTime()) / (1000 * 60) -wxTime;

time= time + t / (8 * 60);

}else{double t = (end.getTime() - start.getTime()) / (1000 * 60);

time= time + t / (8 * 60);

}

list.remove(en);

}//天数计算集合中剩下的个数就可以

time = time +list.size();returntime;

}

}

/*** 去重

*@paramstr

*/@Overridepublic List removal(Liststr) {

Set s = new HashSet(str);

str.clear();

str.addAll(s);returnstr;

}/*** 获取两个日期之间的所有日期,去掉周末

*@paramstartDate

*@paramendDate

*/@Overridepublic ListgetDates(String startDate, String endDate) {

List result = new ArrayList();

Calendar startDay=Calendar.getInstance();

Calendar endDay=Calendar.getInstance();

startDay.setTime(StringToDate(startDate,3));

endDay.setTime(StringToDate(endDate,3));while(startDay.before(endDay)) {int week =startDay.get(Calendar.DAY_OF_WEEK);if (7 != week && 1 !=week) {

result.add(dateToString(startDay.getTime(),3));

}

startDay.add(Calendar.DAY_OF_YEAR,1);

}//验证结束日期是否是周六周日

int week =endDay.get(Calendar.DAY_OF_WEEK);if (7 != week && 1 !=week) {

result.add(dateToString(endDay.getTime(),3));

}returnresult;

}/*** 字符串转时间

*@paramdateStr

*@paramindex

*/@Overridepublic Date StringToDate(String dateStr, intindex) {

DateFormat df= null;try{

df= newSimpleDateFormat(dateFormat[index]);returndf.parse(dateStr);

}catch(Exception aioe) {return null;

}

}/*** 时间转字符串

*@paramdate

*@paramindex

*/@Overridepublic String dateToString(Date date, intindex) {if (date == null) {return null;

}return newSimpleDateFormat(dateFormat[index]).format(date);

}/*** 获取法定节假日或者调休

*@paramnum

*/@Overridepublic List holiday(intnum) {if (num == 2) {return Arrays.asList(this.holiday2());

}else{return Arrays.asList(this.holiday1());

}

}/*** 获取不同部门工作时间

*/@OverridepublicString[] workTime() {return this.workTimes();

}

@Overridepublic double halfDayMath(doubletime){

String timeStr= time+"";

System.out.println("timeStr = [" + timeStr + "]");

String[] timeArr= timeStr.split("\\.");int t1 = Integer.valueOf(timeArr[0]);

System.out.println("t1 = [" + t1 + "]");int t2 = Integer.valueOf(timeArr[1].substring(0, 1));

System.out.println("t2 = [" + t2 + "]");if (t2 < 5){returnt1;

}else if (t2>5){

t1++;returnt1;

}else{return t1+0.5f;

}

}

}


版权声明:本文为weixin_42317885原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。