java两个时间差的计算方式,求大神指点!!

swing wang 2017-07-10 03:40:56
一个很老的项目,今天来了个新需求,需要修改之前的算法。简而言之是这样的:
维修工时算法改造,维修工时计算根据是否是市区以及是否是vip客户而定。
市区的vip客户:8个工作时以内;非市区vip客户:12个工作时以内;市区的普通客户:24个工作时以内;非市区的普通客户:48个工作时以内。
每天上班时间:8:00-20:00
从超过以上时间后开始计算每个工单的超时时间,不满1天按1天计算。
已知工单的受理时间acceptDate(格式是yyyy-MM-dd HH:mm:ss)、客户类型isVIP、客户地区isCity三个属性。都是求受理时间到当前时间的历时,如果没超时就无所谓,超时了就要算超时工单以及超了几天。
恳求各位大神指点,想了一天了,没有一个好点的思路。不论给思路或者给代码都可以。
...全文
629 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
先计算当前时间到受理时间中相隔的工作时间, 然后根据传入的isVip,isCity,减去相应的响应时间 最后如果结果是大于0的,返回 (结果时间除以8小时)+1
「已注销」 2017-07-12
  • 打赏
  • 举报
回复 1
纯手打,仅供参考:
// 标志位:市区
private static final int CUSTOMER_FLAG_URBAN = 1 << 0;
// 标志位:VIP
private static final int CUSTOMER_FLAG_VIP   = 1 << 1;
private static final int WORK_HOUR_START = 8;
private static final int WORK_HOUR_END = 20;

private static final String dfs = "yyyy-MM-dd HH:mm:ss";
private static final DateFormat dft = new SimpleDateFormat(dfs);
private static final Map<Integer, Integer> map = new HashMap<>();
static {
	map.put(0, 48);
	map.put(CUSTOMER_FLAG_URBAN, 24);
	map.put(CUSTOMER_FLAG_VIP, 12);
	map.put(CUSTOMER_FLAG_VIP | CUSTOMER_FLAG_URBAN, 8);
}
private static final Calendar cal = Calendar.getInstance();
// 受理时间
private static final Calendar cal1 = (Calendar)cal.clone();
// 当前时间
private static final Calendar cal2 = (Calendar)cal.clone();
// 只计算小时差因此清零分、秒、毫秒
static {
	cal2.set(Calendar.MINUTE, 0);
	cal2.set(Calendar.SECOND, 0);
	cal2.set(Calendar.MILLISECOND, 0);
}
int GetTimeoutInDays(String time, boolean isVIP, boolean isUrban)
{
	int res = 0;
	int key = 0;
	if (isVIP) {
		key |= CUSTOMER_FLAG_VIP;
	}
	if (isUrban) {
		key |= CUSTOMER_FLAG_URBAN;
	}
	try {
		// 受理时间起距现在总小时数
		int timeoutHours = 0;
		// 受理时间
		Date dt1 = dft.parse(time);
		cal1.setTime(dt1);
		// 清零分、秒、毫秒
		cal1.set(Calendar.MINUTE, 0);
		cal1.set(Calendar.SECOND, 0);
		cal1.set(Calendar.MILLISECOND, 0);
		// 受理时间小时数
		int beforeHour = cal1.get(Calendar.HOUR_OF_DAY);
		if ((beforeHour >= WORK_HOUR_START) && (beforeHour < WORK_HOUR_END)) {
			// 如果受理时间在工作时间范围内:
			// 总小时数加上自受理时起小时数
			timeoutHours += (WORK_HOUR_END - beforeHour);
		}
		// 当前时间小时数
		int afterHour = cal2.get(Calendar.HOUR_OF_DAY);
		if ((afterHour >= WORK_HOUR_START) && (afterHour < WORK_HOUR_END)) {
			// 如果当前时间在工作时间范围内:
			// 1. 将受理时间的小时数改为当前小时数(统一小时以方便后边计算日期差)
			// 2. 总小时数加上(当前小时数-受理小时数)
			cal1.set(Calendar.HOUR_OF_DAY, afterHour);
			timeoutHours += (afterHour - beforeHour);
		} else {
			// 如果当前时间不在工作时间范围内:
			// 将当前时间和受理时间都改成工作起始时间
			cal1.set(Calendar.HOUR_OF_DAY, WORK_HOUR_START);
			cal2.set(Calendar.HOUR_OF_DAY, WORK_HOUR_START);
		}
		while (cal1.after(cal2)) {
			// 如果受理时间<当前时间(前面已统一小时并清零分、秒、毫秒)
			// 总小时数加上每天的工作小时数
			timeoutHours += (WORK_HOUR_END - WORK_HOUR_START);
			// 日期加一以继续比较
			cal1.add(Calendar.DAY_OF_MONTH, 1);
		}
		Integer timeoutBase = map.get(key);
		// 是否已超时?
		if (timeoutHours > timeoutBase) {
			// 超出的小时数
			int exceededHour = (timeoutHours - timeoutBase);
			int exceededBase = WORK_HOUR_END - WORK_HOUR_START;
			// 超出的天数
			res = exceededHour / exceededBase;
			// 如果零头大于零多加一天
			if ((exceededHour % exceededBase) > 0) {
				res++;
			}
		}
	} catch (ParseException e) {
		return -1;
	}
	return res;
}
1. 代码未验证,语法和拼写未检查。 2. 由于不知道你说的超时的天数的计算方式,目前按照自己理解写了一个。
minemine0418 2017-07-10
  • 打赏
  • 举报
回复
把客户查出来,遍历 ,判断客户类型,计算受理时间acceptDate与当前时间的时间差,判断对应类型的客户时间差是不是在对应区间内,不在即为超时 ,
soton_dolphin 2017-07-10
  • 打赏
  • 举报
回复
举个例子,没看明白需求
qq_39463226 2017-07-10
  • 打赏
  • 举报
回复 1
好好想想吧骚年

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧