我有一个需要在固定时间内解决的问题(4小时严重,10小时重要,24小时正常)。如果在中间或假日之间有非工作时间,则可以增加查询时间。非工作可以是特定日期的全天或一小时。
例如:星期一上午08:02提出的一项重要调查应在下午01:00之前解决。
//Working hours of week
Mon 09:00am - 01:00pm
Tue Holiday
Wed 09:00am - 05:00pm(non working between 01:00pm - 02:00pm)
Thu 11:00am - 03:00pm(non working between 01:00pm - 02:00pm)
Fri 09:00am - 05:00pm(non working between 01:00pm - 02:00pm)
输入是查询类型和查询日志时间。需要的输出是解决时间。
我的方法:
将所有res小时数添加到查询中,就好像所有小时都在工作一样。所以,如果日志时间是08:02 am,关键enq加4小时,即12:02 pm作为res时间。
输入while(true)循环,我检查下一个hr是否是工作时间。如果是,则跳过该小时,否则将其添加到res时间并继续。
但是当日志时间不起作用时,这种方法并没有给我正确的结果。
NSDate *enqExpiration = nil;
int hoursNeededToCoverEnq = 0;
switch (enqType) {
case normalPriority:
hoursNeededToCoverEnq = lowResHours;
enqExpiration = [NSDate dateWithTimeInterval:lowResHours*hour sinceDate:capturedTime];
break;
case importantPriority:
hoursNeededToCoverEnq = mediumResHours;
enqExpiration = [NSDate dateWithTimeInterval:mediumResHours*hour sinceDate:capturedTime];
break;
case criticalPriority:
hoursNeededToCoverEnq = highResHours;
enqExpiration = [NSDate dateWithTimeInterval:highResHours*hour sinceDate:capturedTime];
break;
}
int aggregatedHrs = 0;
while(true){
capturedTime = [NSDate dateWithTimeInterval:1*hour sinceDate:capturedTime];
NSDateFormatter *dayFormat = [[NSDateFormatter alloc] init];
[dayFormat setTimeZone: [NSTimeZone timeZoneWithAbbreviation:@"GMT"]];
[dayFormat setDateFormat:@"EEEE"];
NSString* capturedDay = [dayFormat stringFromDate:capturedTime];
[dayFormat setDateFormat:@"dd/MM/yyyy"];
NSString* todayDate = [dayFormat stringFromDate:capturedTime];
if([weekends containsObject:capturedDay]){
enqExpiration = [NSDate dateWithTimeInterval:1*hour sinceDate:enqExpiration];
continue;
}else if([holidays containsObject:todayDate]){
enqExpiration = [NSDate dateWithTimeInterval:1*hour sinceDate:enqExpiration];
continue;
}else{
NSString *openTime, *closeTime;
for(int i=0; i<weekdaysTime.count; i++){
if([[((NSMutableDictionary*)[weekdaysTime objectAtIndex:i]) valueForKey:@"workingDay"] isEqualToString:capturedDay]){
openTime = [((NSMutableDictionary*)[weekdaysTime objectAtIndex:i]) valueForKey:@"openingTime"];
closeTime = [((NSMutableDictionary*)[weekdaysTime objectAtIndex:i]) valueForKey:@"closingTime"];
break;
}
}
NSDate *openTimeToday = nil, *closeTimeToday = nil;
[dayFormat setDateFormat:@"dd/MM/yyyy hh:mmaa"];
openTimeToday = [dayFormat dateFromString:[[todayDate stringByAppendingString:@" "] stringByAppendingString:openTime]];
closeTimeToday = [dayFormat dateFromString:[[todayDate stringByAppendingString:@" "] stringByAppendingString:closeTime]];
if([capturedTime compare:openTimeToday]==NSOrderedAscending || [capturedTime compare:closeTimeToday]==NSOrderedDescending ){
enqExpiration = [NSDate dateWithTimeInterval:1*hour sinceDate:enqExpiration];
continue;
}
}
aggregatedHrs ++;
if( aggregatedHrs == hoursNeededToCoverEnq )
break;
}
return enqExpiration;