Проверьте, находится ли текущая дата между двумя указанными датами

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

 NSDate *now = [NSDate new];
    NSLog(@"Now is %@",now);
    NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar];
    NSDateComponents* components = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
    [components setYear:2013];
    [components setMonth:06];
    [components setDay:28];
    [components setHour:5];
    [components setMinute:00];
    NSDate *startDate1 = [myCalendar dateFromComponents:components];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.timeZone = [NSTimeZone localTimeZone];
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    NSLog(@"start dateeee is %@",startDate1);

    NSDateComponents* components2 = [myCalendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:[NSDate date]];
    [components2 setYear:2013];
    [components2 setMonth:06];
    [components2 setDay:29];
    [components2 setHour:4];
    [components2 setMinute:59];

    NSDate *endDate1 = [myCalendar dateFromComponents:components];
    NSLog(@"end date is %@",endDate1)

;

Сейчас я создал 2 даты Startdate1 а также endDate1, Чтобы проверить, находится ли текущая дата между этими датами, я делаю это.

NSComparisonResult result1 = [now compare:startDate1];
    NSComparisonResult result2 = [now compare:endDate1];
if (result2 == NSOrderedSame && result1 == NSOrderedSame ) {
        NSLog(@"HELL YEAH! ");
    }

Но я никогда не получаю АД АГА??

ПРИМЕЧАНИЕ. Я установил в своем iPhone дату и время между началом и окончанием. Также вот мои ЛОГИ:

2013-06-29 11:11:48.727 Genk on stage[2205:907] Now is 2013-06-29 09:11:48 +0000
2013-06-29 11:11:48.728 Genk on stage[2205:907] start dateeee is 2013-06-28 03:00:00 +0000
2013-06-29 11:11:48.729 Genk on stage[2205:907] end date is 2013-06-28 03:00:00 +0000

5 ответов

Измени свой код на

if (result2 == NSOrderedDescending && result1 == NSOrderedAscending ) {
        NSLog(@"HELL YEAH! ");
    }

Это может решить вашу проблему

Удачного кодирования:)

Ваша логика ошибочна. Возвращаемое значение NSOrderedSame означает, что два сравниваемых значения равны. Это не то, что вы хотите. Вместо этого вы хотите проверить, предшествует ли первая дата текущей, а вторая - после:

if (result1 == NSOrderedAscending && result2 == NSOrderedDescending)

это то, что вы должны написать.

Вы можете использовать следующий код.

NSTimeInterval fromTime = [startDate1 timeIntervalSinceReferenceDate];
NSTimeInterval toTime = [endDate1 timeIntervalSinceReferenceDate];
NSTimeInterval currTime = [[NSDate date] timeIntervalSinceReferenceDate];
if(currTime>fromTime && currTime<toTime)
{
      //current time lies between the two dates
}
NSDate * now;.....
NSDate * endDate1;......

if ([now compare: endDate1] == NSOrderedDescending) {
    NSLog(@"now is later than endDate1");        

} else if ([now compare: endDate1] == NSOrderedAscending) {
    NSLog(@"now is earlier than endDate1");

} else {
    NSLog(@"dates are the same");

}

Вы можете проверить это с помощью этого:

- (BOOL)yourDate:(NSDate *)date inRangeFirstDate:(NSDate *)startDate lastDate:(NSDate *)endDate {
   return [date compare:startDate] == NSOrderedDescending &&
          [date compare:endDate]  == NSOrderedAscending;
}

Если он вернется YES тогда yourDate лежит между startDate и endDate, иначе он возвращает NO,

Надеюсь, это поможет вам

Другие вопросы по тегам