62,615
社区成员
发帖
与我相关
我的任务
分享
// 标志位:市区
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. 由于不知道你说的超时的天数的计算方式,目前按照自己理解写了一个。