【问题标题】:Finding whether current time is between a range provided in string (hh:mm) like 10:30-11:30 or 12:30-13:30 etc查找当前时间是否在字符串 (hh:mm) 中提供的范围之间,例如 10:30-11:30 或 12:30-13:30 等
【发布时间】:2015-01-06 07:26:35
【问题描述】:

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

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

【问题讨论】:

  • 针对什么进行了优化?代码行数?速度?做过任何分析吗?如果它有效,你为什么要改变它?
  • 我想让它简短,所以优化代码行数
  • 这个问题似乎跑题了,因为它是关于代码审查的,属于codereview.stackexchange.com
  • 您实际上可以删除更改行并将所有内容变为 1 行。但这不会提高性能,反而会使可读性变差。

标签: objective-c datetime string-parsing


【解决方案1】:

首先,您的代码在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...
}

【讨论】:

    【解决方案2】:

    根据您的时间间隔创建两个 NSDate 对象,一个用于开始时间,另一个用于结束时间。

    从当前时间获取第三个 NSDate。

    [date1 compare:date2]==NSOrderDescending means date2 is smaller than date1 and so..
    

    希望这会有所帮助..

    【讨论】:

      猜你喜欢
      • 2016-09-27
      • 1970-01-01
      • 2020-03-18
      • 2020-09-16
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      • 1970-01-01
      相关资源
      最近更新 更多