工作时效计算逻辑与算法时效--对节假日、周末调班、周末时间进行处理

前几天项目中要开发一个计算时效的功能,在网上找了好久没有找到相关的代码,只要自己埋头苦干来设计它的逻辑和算法了。
时效也就是正常工作的时间。
项目是一个问题反馈相关的系统。对于一个问题反馈有上报时间和解决时间,这两个时间的差值即为解决这个问题的时效。当然如果紧紧是两者相减,也就不用这么大费周章了。它需要排除中午休息时间,下班时间、上班前时间、周末时间、节假日时间、节假日调班时间。
现在来整理下时效计算应该考虑到的问题:
     目的:计算出正确的时效。
     计算方式:解决时间-上报时间。
     处理:
     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; 
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值