iPhone – 比较date不按预期工作

我有一个设置为特定date的事件。 我想检查date是否在当前date的5分钟范围内。 例如:如果事件设置为晚上9:10,现在是晚上9:02。 我想看看目前的时间是在9点05分到9点15分之间。

所以,我呢…

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作为结果,任何date。

任何线索?

谢谢。

尝试下面的代码。

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

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

我认为EmptyStack的解决scheme是最好的这个问题,但我只是简化它如下:

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

我对此很好奇…所以我写了一个快速testing,一切都按照我预期的那样工作。 给出下面的示例代码,在第一次运行中,正如预期的那样,加五的NSOrderedAscending与现在相比,减五是NSOrderedDescending 。 在第二轮中,与现在三分钟之后的date相比,加五是NSOrderedAscending ,减五是NSOrderedDescending 。 最后,再加上五个是NSOrderedDescending ,减去五个也是NSOrderedDescending ,比起二十分钟之后的一个date,再次如预期的那样。

 // 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; }