2011-08-20 34 views
0

我有一个事件设置为特定的日期。我想检查日期是否在当前日期的5分钟范围内。例如:如果事件设置为晚上9:10,现在是晚上9:02。我想看看目前的时间是在9点05分到9点15分之间。iPhone - 比较日期不按预期工作

所以,我做...

NSDate *currentDate ... this variable contains the current date 
NSDate *plusFive = [eventDate dateByAddingTimeInterval:300]; 
NSDate *minusFive = [eventDate dateByAddingTimeInterval:-300]; 

NSComparisonResult result1 = [eventDate compare:minusFive]; 
NSComparisonResult result2 = [eventDate compare:plusFive]; 


if ((result1 == NSOrderedAscending) && (result2 == NSOrderedDescending)) { 
    // if the current date is not inside the 5 minutes window 
    // or in other words, if the currentDate is lower than minusFive and bigger 
    // than plusFive 
    [self currentDateIsOutsideTheWindow]; 
} else { 
    [self currentDateIsInsideTheWindow]; 
} 

问题是,RESULT1和RESULT2总是给我NSOrderedAscending结果,对于任何日期。

任何线索?

谢谢。

+0

你为什么使用'eventDate'而不是'currentDate'? – jtbandes

+0

我在我的答案中添加了一个快速代码示例...日期的'compare:'方法似乎按照我的预期工作,但我建议按照答案中的建议简化代码。 –

+0

这是一个错字。谢谢。 – SpaceDog

回答

2

请尝试下面的代码。

NSTimeInterval ti = [eventDate timeIntervalSinceDate:currentDate]; 
if (ti > 0 && ti < 300) ... 
else if (ti < 0 && ti > -300) ... 
+0

谢谢!!!!!!!!!!!! – SpaceDog

1

我想你应该在计算中切换eventDate和currentDate。

1

我觉得EmptyStack的解决方案是最好的这个问题,但我只是把它简化为:

if(fabs([eventDate timeIntervalSinceNow]) <= 300.0) { 
    // within the window 
} else { 
    // outside the window 
} 

我很好奇这个......所以我写了一个快速测试一切都按我的预期工作。根据下面的示例代码,在第一次运行中,正如预期的那样,加五的值为NSOrderedAscending,而负五则为NSOrderedDescending。在第二轮中,加上五个是NSOrderedAscending,减去五是NSOrderedDescending,与从现在起三分钟的日期相比。最后,再加上五个是NSOrderedDescending,减去五个也是NSOrderedDescending,与此同时,二十分钟后的所有预期都是如此。

// datetest.m 
// clang -o datetest datetest.m -framework foundation 

#import <Foundation/Foundation.h> 

void test_compare(NSDate* event_date) 
{ 
    NSDate* dateNow = [NSDate date]; 

    NSDate* minusFive = [event_date dateByAddingTimeInterval:-300.0]; 
    NSDate* plusFive = [event_date dateByAddingTimeInterval:300.0]; 

    NSComparisonResult minusFiveResult = [dateNow compare:minusFive]; 
    NSComparisonResult plusFiveResult = [dateNow compare:plusFive]; 

    NSLog(@"P5: %ld, M5: %ld; dates (now, event, p5, m5):\n\t%@\n\t%@\n\t%@\n\t%@", (long int)plusFiveResult, (long int)minusFiveResult, 
     dateNow, event_date, plusFive, minusFive); 
} 

int main (int argc, char const *argv[]) 
{ 
    NSAutoreleasePool *pool = [NSAutoreleasePool new]; 

    // test for an event that's "now" 
    NSDate* now = [NSDate date]; 
    test_compare(now); 

    // test for an event that's three minutes from now 
    NSDate* threeMinutesLater = [now dateByAddingTimeInterval:180.0]; 
    test_compare(threeMinutesLater); 

    // test for an event that's 20 minutes ago 
    NSDate* twentyMinutesBefore = [now dateByAddingTimeInterval:-1200.0]; 
    test_compare(twentyMinutesBefore); 

    [pool drain]; 
    return 0; 
} 
+0

谢谢!!!!!!!!!!!! – SpaceDog