我想检查当前时间是否在字符串中提供的范围之间。
例如:range = 10:30 - 15:45,当前时间是11:50,在这种情况下,方法应该返回YES否则为NO(15:50)。
我正在使用以下代码,这工作正常。但我正在寻找一些优化的方法。任何人都可以建议我,还有什么其他好方法可以达到同样目的。
-(BOOL)checkTimeRange :(NSString *)timeRange
{
NSUInteger lowerRange = [[timeRange substringWithRange:NSMakeRange(0, 2)] integerValue] * 60* 60 + [[timeRange substringWithRange:NSMakeRange(3, 2)] integerValue] * 60;
NSUInteger upperRange = [[timeRange substringWithRange:NSMakeRange(6, 2)] integerValue] * 60 * 60 + [[timeRange substringWithRange:NSMakeRange(9, 2)] integerValue] * 60;
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitHour fromDate:[NSDate date]];
NSInteger hour = [components hour];
components = [[NSCalendar currentCalendar] components:NSCalendarUnitMinute fromDate:[NSDate date]];
NSInteger minute = [components minute];
NSUInteger currentTime = hour *60*60 + minute*60;
if(currentTime >= lowerRange && currentTime <= upperRange)
return YES;
return NO;
}
答案 0 :(得分:0)
首先,您的代码在lowerRange
和upperRange
初始化部分时并不安全。如果您的字符串包含错误数据怎么办在这种情况下,您的程序将崩溃。你需要检查参数。使用NSRegularExpression
来实现此目的。你可以用它来获得范围。有关更多模式,请查看reference page。
- (BOOL)checkTimeRange:(NSString *)timeRange
{
if(!timeRange || timeRange.count==0)
return NO;
NSError *error;
NSRegularExpression *regexpr = [[NSRegularExpression alloc] initWithPattern:@"(0-9|:)" options:0 error:&error];
if (error)
return NO;
NSArray *matches = [regexpr matchesInString:timeRange options:0 range:NSMakeRange(0,timeRange.length)];
if (!matches || matches.count<2)
return NO;
NSDateFormatter *formatter=[[NSDateFormatter alloc] init];
[formatter setDateFormat:@"HH:mm"];
// get the dates
NSDate *date0 = [formatter dateFromString:matches[0]];
NSDate *date1 = [formatter dateFromString:matches[1]];
// get components from the dates...
}
答案 1 :(得分:0)
从您的时间间隔创建两个NSDate对象,一个用于开始时间&amp;其他的结束时间。
从您当前时间获得第三个NSDate。
[date1 compare:date2]==NSOrderDescending means date2 is smaller than date1 and so..
希望这会有所帮助..