如何查找NSDate是否在指定范围内?

时间:2011-04-07 01:16:26

标签: objective-c ios nsdate

所以,如果NSDate在特定范围内,我会遇到困难时间(没有双关语)。考虑一下:下午5:00到下午6:00之间的预定访问。我想知道预定的访问是否在当前时间的+/- 15分钟内。因此我的安全范围是下午4:45到下午6:15。如何查看预定的访问是否在范围内?这是我到目前为止所获得的代码,它根本不起作用......

- (BOOL)isInScheduledRange {
//    NSLog(@"Start: %f", [self.start timeIntervalSinceNow]);
//    NSLog(@"End: %f", [self.end timeIntervalSinceNow]);
//    
//    if (([self.start timeIntervalSinceNow] >= -900) && ([self.end timeIntervalSinceNow] <= 3600)) {
//        NSLog(@"In Range");
//        
//        return YES;
//    }
//    
    NSDate *now = [[NSDate alloc] init];

//    if ((([self.start timeIntervalSinceDate:now] >= -900) && ([self.start timeIntervalSinceDate:now] <= 900)) && (([self.end timeIntervalSinceDate:now] <= -900) && ([self.end timeIntervalSinceDate:now] >= 900))) {
//        NSLog(@"In Range");
//    }

    NSLog(@"%@; %@; %@", now, self.start, self.end);
//    NSLog(@"%@; %@", [self.start timeIntervalSinceDate:now], [self.end timeIntervalSinceDate:now]);

    if ((([self.start timeIntervalSinceDate:now] >= -900) && ([self.start timeIntervalSinceDate:now] <= 0)) && (([self.end timeIntervalSinceDate:now] >= 0) && ([self.end timeIntervalSinceDate:now] <= 900))) {
        NSLog(@"In Range");
    }

    return NO;

    [now release];
}

我很感激一些帮助。我在这个时间计算上遇到了困难。

另外,不管我在哪个平台上工作,我讨厌处理时间......

4 个答案:

答案 0 :(得分:6)

您想要检查当前时间后的开始时间是否小于900秒,当前时间之前的结束时间是否小于900秒。 timeIntervalSinceDate:如果在参数后调用它的对象是,则返回正数,您需要检查start&lt; = 900和end&gt; = -900。此外,您可以使用timeIntervalSinceNow来简化代码,而不是手动获取当前日期并将其传递给timeIntervalSinceDate:。最后,如果你可以假设(或者先前已经确定)开始在结束之前,那么你不需要两个中间测试,因为它们都必须是真的,其他两个都是真的。

if([self.start timeIntervalSinceNow] <= 900 && [self.end timeIntervalSinceNow] >= −900) {
    NSLog(@"In range")
}

答案 1 :(得分:3)

这是一些详细(和愚蠢)的代码,解释了我解决这个问题的方法

NSTimeInterval secondsBeforeStart = [self.start timeIntervalSinceNow];
if ( secondsBeforeStart > (15 * 60))
{
    // The result for '[self.start timeIntervalSinceNow]' is positive as long
    //  as 'self.start' remains in the future. We're not in range until there
    //  are 900 seconds to go or less.
    NSLog( @"Still time to chill.");

    // More than fifteen minutes to go so return NO.
    return NO;
}
else
{
    NSLog( @"OMG did I miss it!!!");
    NSTimeInterval secondsBeforeEnd = [self.end timeIntervalSinceNow];
    if ( secondsBeforeEnd < -( 15 * 60))
    {
        // The result for '[self.end timeIntervalSinceNow]' is negative when
        //  'self.end' is in the past. 
        // It's been more than 900 seconds since the end of the appointment
        //  so we've missed it.
        NSLog( @"Ahhhhh!!!");

        // More than 900 seconds past the end of the event so return NO.
        return NO;
    }
    else
    {
        // We are somewhere between 900 seconds before the start and
        //  900 seconds before the end so we are golden.
        NSLog( @"Whew, we made it.");
        return YES;
    }
}

我编码的方式就是

BOOL inRange = NO;  // Assume we are not in the proper time range.

if ( [self.start timeIntervalSinceNow] <= ( 15 * 60))
{
    // 'Now' is at least 900 seconds before the start time but could be later.
    if ( [self.end timeIntervalSinceNow] >= -( 15 * 60))
    {
        // 'Now' is not yet 900 seconds past the end time.
        inRange = YES
    }
}

return inRange;

注意:我实际上没有编译过这个,但我很确定逻辑是正确的。

最后,您确实注意到了最后两行

    return NO;

    [now release];
}

会造成内存泄漏。 (释放然后返回; ^))

答案 2 :(得分:2)

这是一个距离问题 - 您想知道当前时间是否在目标时间的900秒内。通过取两点之差的绝对值来计算距离问题。通过取差值的绝对值,两个样本的顺序无关紧要。

/** 
 * @brief Return YES if the current time is within 900 seconds of the meeting time (NSDate* time).
 */
-(BOOL)currentTimeIsWithin900SecondsOf:(NSDate*)time
{
    NSDate* now = [NSDate date];
    return fabs( [now timeIntervalSinceReferenceDate] - [time timeIntervalSinceReferenceDate] ) < 900;
}

答案 3 :(得分:0)

您需要创建三个NSDate。然后使用intervalSinceReferenceDate将NSDates转换为时间间隔并比较它们。您可以使用NSDateComponents手动设置NSDates。