查找当前时间是否在字符串(hh:mm)中提供的范围之间,如10:30-11:30或12:30-13:30等

时间:2015-01-06 07:26:35

标签: objective-c datetime string-parsing

我想检查当前时间是否在字符串中提供的范围之间。

例如: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;
}

2 个答案:

答案 0 :(得分:0)

首先,您的代码在lowerRangeupperRange初始化部分时并不安全。如果您的字符串包含错误数据怎么办在这种情况下,您的程序将崩溃。你需要检查参数。使用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..

希望这会有所帮助..