iPhone - сравнение дат не работает должным образом - PullRequest
0 голосов
/ 20 августа 2011

У меня есть событие с определенной датой.Я хочу проверить, находится ли дата в диапазоне 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 в результате, на любую дату.

Любые подсказки?

спасибо.

Ответы [ 3 ]

2 голосов
/ 20 августа 2011

Попробуйте следующий код.

NSTimeInterval ti = [eventDate timeIntervalSinceDate:currentDate];
if (ti > 0 && ti < 300) ...
else if (ti < 0 && ti > -300) ...
1 голос
/ 20 августа 2011

Я думаю, что решение 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;
}
1 голос
/ 20 августа 2011

Я думаю, что вы должны переключаться между eventDate и currentDate в ваших вычислениях.

...