Я думаю, что решение 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;
}