請假時間計算(未完成節假日部分)
阿新 • • 發佈:2018-11-12
package com.thinkgem.jeesite.modules.kaoqin.utils; import java.text.ParseException; import java.util.Date; import java.util.HashMap; import java.util.Map; import com.thinkgem.jeesite.common.utils.DateUtils; /** * 請假時間 (跨年、跨月、跨天、節假日) * @author xl * @see */ public class LeaveUtils { private static final String GOMTIME = " 08:00:00"; private static final String OFFMTIME = " 12:00:00"; private static final String GOATIME = " 13:00:00"; private static final String OFFATIME = " 17:00:00"; private static final long HOUR = 1000 * 60 * 60; private static final long MINUTE = 1000 * 60; /** * * @param sb * @param dayTime 每天上班時間 * @param key map的key * @param date 請假日期 * @return */ public static Map<String,String> convertTime(String key,String dayTime,Date date) { Map<String,String> map = new HashMap<String,String>(); String day = DateUtils.dateToString("yyyy-MM-dd", date); if ((dayTime != null && !"".equals(dayTime))&& (key != null && !"".equals(key))) { StringBuffer sb = new StringBuffer(); sb.append(day).append(dayTime); map.put(key, sb.toString()); return map ; } StringBuffer gmtSB = new StringBuffer(); StringBuffer omtSB = new StringBuffer(); StringBuffer gatSB = new StringBuffer(); StringBuffer oatSB = new StringBuffer(); map.put("gmt", gmtSB.append(day).append(GOMTIME).toString()); map.put("omt", omtSB.append(day).append(OFFMTIME).toString()); map.put("gat", gatSB.append(day).append(GOATIME).toString()); map.put("oat", oatSB.append(day).append(OFFATIME).toString()); return map; } static long b1 = 0l ; static long b2 = 0l ; static long b3 = 0l ; static long b4 = 0l ; static long e1 = 0l ; static long e2 = 0l ; static long e3 = 0l ; static long e4 = 0l ; /** * dataMap * @param begin * @param end */ public static void setDataMap(Date begin,Date end){ Map<String, String> beginMap = convertTime(null,null,begin); b1 = DateUtils.strToDate(null, beginMap.get("omt")).getTime();//12 b2 = DateUtils.strToDate(null, beginMap.get("gat")).getTime();//1 b3 = DateUtils.strToDate(null, beginMap.get("oat")).getTime();//5 Map<String, String> endMap = convertTime( null, null, end); e2 = DateUtils.strToDate(null, endMap.get("omt")).getTime();//12 e1 = DateUtils.strToDate(null, endMap.get("gat")).getTime();//1 e4 = DateUtils.strToDate(null, endMap.get("gmt")).getTime();//8 } /** * 請假時間總和主要呼叫 * @param begin * @param end * @param type * @return * @throws ParseException */ public static int sumTime(Date begin,Date end) throws ParseException { int count = DateUtils.getWeekdayCount(begin,end,false); if (DateUtils.getYear(begin).equals(DateUtils.getYear(end)) && DateUtils.getMonth(begin).equals(DateUtils.getMonth(begin))) {//同年同月 setDataMap(begin,end); if (DateUtils.getDay(begin).equals(DateUtils.getDay(end))) { return matchLeaveDays(begin, end, 0) - 8 * count; }else { return matchLeaveDays(begin, end, 1) - 8 * count; } }else{ //跨年或跨月 return matchLeaveDays(begin, end, 2) - 8 * count; } } /** * 計算請假時間 * @param begin * @param end * @param type * @return */ private static int matchLeaveDays(Date begin,Date end,int type){ if (type == 0) {//不跨天 if (begin.getTime()<b1 && end.getTime()>e1) { int leaveTime = (int)((end.getTime() - begin.getTime())/HOUR); return leaveTime-1; } int leaveTime = (int)((end.getTime() - begin.getTime())/HOUR); return leaveTime; }else if (type==1){//跨天 return leave(begin,end); }else if(type == 2){ //跨年跨月 Date beginEnd = DateUtils.getMonthLastDay(begin); setDataMap(begin,beginEnd); leave(begin,beginEnd); Date endBegin = DateUtils.getMonthFirstDay(end); setDataMap(endBegin,end); leave(endBegin,end); } return type; } /** * 計算請假時間 * @param begin * @param end * @return */ public static int leave(Date begin,Date end){ int intervalDay=Integer.valueOf(DateUtils.getDay(end)) - Integer.valueOf(DateUtils.getDay(begin)); int leaveTime1 = 0; int leaveTime2 = 0; if ((begin.getTime()<b1 && end.getTime()<e2)||//上午-上午 (b2<begin.getTime() && end.getTime()>e1)) {//下午-下午 leaveTime1 = (int)((b3 - begin.getTime())/HOUR) -1; leaveTime2 = (int)((end.getTime() -e4)/HOUR); }else if ((begin.getTime()<b1 && end.getTime()>e1)) {//上午-下午 leaveTime1 = (int)((b3 - begin.getTime())/HOUR) -1; leaveTime2 = (int)((end.getTime() - e4)/HOUR)-1; }else if(b2<begin.getTime() &&end.getTime()<e2) { //下午-上午 leaveTime1 = (int)((b3 - begin.getTime())/HOUR); leaveTime2 = (int)((end.getTime() - e4)/HOUR); } return leaveTime1 + leaveTime2 + (intervalDay-1) * 8; } public static void main(String[] args) throws ParseException { Date beginTime = DateUtils.strToDate("yyyy-MM-dd HH:mm", "2018-01-01 09:00"); Date endTime = DateUtils.strToDate("yyyy-MM-dd HH:mm", "2018-01-31 09:00"); int leaveTime = LeaveUtils.sumTime(beginTime, endTime); System.out.println("qing jia shi jian:----" + leaveTime); System.out.println("每月的最後一天:" ); DateUtils.getMonthLastDay(beginTime); System.out.println("倆個日期間有多少個週末:" ); try { int num =DateUtils.getWeekdayCount(beginTime,endTime,false); System.out.println("$$$$$$$$$$$$$$$$$" + num); } catch (ParseException e) { e.printStackTrace(); } } }