需求:
1、给定两个时间 计算两个时间之间的工作小时数.
2、给出一个开始时间startDate,计算其加上x小时之后的时间.
(只考虑到了分钟,秒不计)
前提:
1、节假日及周末日期存放在数据库
源码:
public class CalculateHoursUtil {
//设置上班时间:该处时间可以根据实际情况进行调整
static float morningBegin = 9;//上午上班时间,小时
static float morningEnd = 12.5f;//上午下班时间,小时
static float eveningBegin = 14;//下午上班时间,小时
static float eveningEnd = 18;//下午下班时间,小时
static float noonBreak = eveningBegin-morningEnd;//中午休息时间
static float eveningBreak = 24-eveningEnd+morningBegin;//晚上休息时间
static float morningWork = morningEnd-morningBegin;//上午上班时间
static float eveningWork = eveningEnd-eveningBegin;//下午上班时间
static float operHours = morningWork + eveningWork;//一天上班时间
@SuppressWarnings("deprecation")
public static String findHours(List<HolidayTable> maps,String startDate,float time) {
//用于格式化日期
Date startTime = TimeUtils.formatDate(startDate, "yyyy-MM-dd HH:mm:ss");
Date endTime = null;
//从数据库得到节假日的日期
//从startTime开始循环,若该日期不是节假日或者不是周六日则请假天数+1
Date flag = startTime;//设置循环开始日期
Calendar cal = Calendar.getInstance();
cal.setTime(flag);
outer:while(time/operHours >= 1) {
for (HolidayTable map : maps){
if((TimeUtils.formatDate(TimeUtils.formatDate(flag),"yyyy-MM-dd")).compareTo(map.getHoliday()) == 0){
//跳出循环进入下一个日期
cal.add(Calendar.DAY_OF_MONTH, +1);
flag = cal.getTime();
continue outer;
}
}
//日期往后加一天
cal.add(Calendar.DAY_OF_MONTH, +1);
flag = cal.getTime();
time = time-operHours;
}
float startHours = flag.getHours() + (float)flag.getMinutes()/60;
Date start = TimeUtils.formatDate(TimeUtils.formatDate(flag),"yyyy-MM-dd");
cal.setTime(start);
//时间在上午上班之前
if(startHours <= morningBegin) {
if((time + morningBegin) <= morningEnd) {
time = time + morningBegin ;
} else if((time + morningBegin + noonBreak) <= eveningEnd) {
time = time + morningBegin + noonBreak;
} else {
if((time + morningBegin + noonBreak + eveningBreak) <= morningEnd + 24) {
time = time + morningBegin + noonBreak + eveningBreak;
} else {
time = time + morningBegin + noonBreak