前几天项目中要开发一个计算时效的功能,在网上找了好久没有找到相关的代码,只要自己埋头苦干来设计它的逻辑和算法了。
时效也就是正常工作的时间。
项目是一个问题反馈相关的系统。对于一个问题反馈有上报时间和解决时间,这两个时间的差值即为解决这个问题的时效。当然如果紧紧是两者相减,也就不用这么大费周章了。它需要排除中午休息时间,下班时间、上班前时间、周末时间、节假日时间、节假日调班时间。
现在来整理下时效计算应该考虑到的问题:
目的:计算出正确的时效。
计算方式:解决时间-上报时间。
处理:
1、对于上报时间处理:
(1) 上报时间在上午上班时间之前,将该时间推到当天上午上班时间(例如9:00),
(2) 上报时间在下午下班时间之后,将时间推到下一次上班时间(例如,周三下班时间上报,周四需要上班,那么将其推到周四9:00),对于周五下班后上报问题,需要推到下周一上班时间。(假设周末正常休息,周末调班的后面再说)。
(3)上报时间是在中午休息时间段(12:00-14:00),将时间推到下午上班时间(14:00)。
(4)周末时间上报,推到下一次上班时间。(需要考虑周末是否要上班,即为节假日调班时间)。
(5)正常周一到周五,但是属于节假日,将时间推到下一次正常上班时间。
2、对于解决时间处理:
(1)解决时间在上午上班时间之前,将时间推到上一次下班时间,(例如:周四上班前解决,周三正常上班,则解决时间应该为周三下班时间)。特别要注意的是周一,周一上班前解决的话,需要将时间推到上周五下班时间(假设周六周日正常休息)。
(2)解决时间在下午下班时间之后,将时间推到当天的下午下班时间。
(3)解决时间在中午休息时间段(12:00-14:00),将时间推到当天上午下班时间。
(4)周末解决时间,将时间推到上一次下午上班时间。(需要考虑周末是否要上班,即为解决日调班时间)
(5)正常周一到周五,但是属于节假日,将时间推到上一次下午下班时间。
==========================================================================================
//计算时效
private long countAgeing(DateTime inputTime,DateTime closeTime) throws Exception{
//处理上报时间
inputTime = handleInputTime(inputTime);
//处理结束时间
closeTime = handleCloseTime(closeTime);
return countRealAgeing(inputTime,closeTime);
}
/**
* 实际计算时效的算法
* @param inputTime
* @param closeTime
* @return
* @throws Exception
*/
private long countRealAgeing(DateTime inputTime,DateTime closeTime) throws Exception{
int inputWeek = getWeekTime(inputTime); // 得到上报是间时星期几,1~7表示星期天到星期六
Calendar inputDateCalendar = Calendar.getInstance();
inputDateCalendar.setTime(new DateTime(inputTime,DateTime.YEAR_TO_DAY));
Calendar closeDateCalendar = Calendar.getInstance();
closeDateCalendar.setTime(new DateTime(closeTime,DateTime.YEAR_TO_DAY));
//====================假设这段时间内只是正常的上下班时间,忽略节假日时间==在后面重新将节假日计算进来 start===========
//===每一天节假日,则减一天的上班时间=========================
//===每一个周末调班,则加一天上班时间=========================
long day = 86400000;//一天的millis
long mod =(closeDateCalendar.getTimeInMillis()-inputDateCalendar.getTimeInMillis())/day; //总天数
System.out.println("----->天数:" +mod);
long weekNum = mod/7;
long cut = weekNum * 2; //两天周末
long yuShuDay = mod % 7;