Проверьте, попадает ли время между двумя временными промежутками iOS

У меня есть два раза, скажем, 8:40 и 16:00. Что я хочу сделать, так это проверить, попадает ли текущее время между заданным временем или нет?

Я попробовал этот фрагмент кода, но он не работает :( не могли бы вы помочь мне, где я делаю ошибку?

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:[NSDate date]];
    NSInteger currHr = [components hour];
    NSInteger currtMin = [components minute];

    NSString startTime = @"21:00";
    NSString endTime = @"07:00";
NSArray *arr=[NSArray arrayWithObjects:startTime,endTime, nil];

    int stHr = [[[[arr objectAtIndex:0] componentsSeparatedByString:@":"] objectAtIndex:0] intValue];
    int stMin = [[[[arr objectAtIndex:0] componentsSeparatedByString:@":"] objectAtIndex:1] intValue];
    int enHr = [[[[arr objectAtIndex:1] componentsSeparatedByString:@":"] objectAtIndex:0] intValue];
    int enMin = [[[[arr objectAtIndex:1] componentsSeparatedByString:@":"] objectAtIndex:1] intValue];

    int formStTime = (stHr*60)+stMin;
    int formEnTime = (enHr*60)+enMin;

    int nowTime = (currHr*60)+currtMin;

    if(nowTime >= formStTime && nowTime <= formEnTime) {
        NSLog(@"Btween......");
    }

Спасибо заранее

ИЗМЕНИТЬ:

NSDateComponents *openingTime = [[NSDateComponents alloc] init];
    openingTime.hour = [timeA integerValue]; //8
    openingTime.minute = [timeB integerValue];  //45

    NSDateComponents *closingTime = [[NSDateComponents alloc] init];
    closingTime.hour = [timeC integerValue]; //4
    closingTime.minute = [timeD integerValue];  //43


    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
        [formatter setDateFormat:@"hh:mm"];

        NSString *nowTimeString = [formatter stringFromDate:[NSDate date]];

    NSDate *now = [formatter dateFromString:nowTimeString]; //3:30

    NSDateComponents *currentTime = [[NSCalendar currentCalendar] components:NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond
                                                                    fromDate:now];

    NSMutableArray *times = [@[openingTime, closingTime, currentTime] mutableCopy];
    [times sortUsingComparator:^NSComparisonResult(NSDateComponents *t1, NSDateComponents *t2) {
        if (t1.hour > t2.hour) {
            return NSOrderedDescending;
        }

        if (t1.hour < t2.hour) {
            return NSOrderedAscending;
        }
        // hour is the same
        if (t1.minute > t2.minute) {
            return NSOrderedDescending;
        }

        if (t1.minute < t2.minute) {
            return NSOrderedAscending;
        }
        // hour and minute are the same
        if (t1.second > t2.second) {
            return NSOrderedDescending;
        }

        if (t1.second < t2.second) {
            return NSOrderedAscending;
        }
        return NSOrderedSame;

    }];

    if ([times indexOfObject:currentTime] == 1) {
        NSLog(@"We are Open!");
    } else {
        NSLog(@"Sorry, we are closed!");
    }

person Krunal    schedule 10.04.2015    source источник
comment
Вы смотрели этот поток?   -  person Azat    schedule 10.04.2015
comment
Я не хочу сравнивать две даты.. я хочу проверить, существует ли время между двумя временами   -  person Krunal    schedule 10.04.2015
comment
На самом деле это два сравнения дат. Просто преобразуйте их в объекты NSDate и используйте методы из iOS SDK.   -  person Azat    schedule 10.04.2015
comment
Почему я проголосовал против, я спросил что-то не так?   -  person Krunal    schedule 10.04.2015


Ответы (2)


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

NSDateComponents *openingTime = [[NSDateComponents alloc] init];
openingTime.hour = 8;
openingTime.minute = 40;

NSDateComponents *closingTime = [[NSDateComponents alloc] init];
closingTime.hour = 16;
closingTime.minute = 0;

NSDate *now = [NSDate date];

NSDateComponents *currentTime = [[NSCalendar currentCalendar] components:NSCalendarUnitHour|NSCalendarUnitMinute|NSCalendarUnitSecond
                                                                fromDate:now];

NSMutableArray *times = [@[openingTime, closingTime, currentTime] mutableCopy];
[times sortUsingComparator:^NSComparisonResult(NSDateComponents *t1, NSDateComponents *t2) {
    if (t1.hour > t2.hour) {
        return NSOrderedDescending;
    }

    if (t1.hour < t2.hour) {
        return NSOrderedAscending;
    }
    // hour is the same
    if (t1.minute > t2.minute) {
        return NSOrderedDescending;
    }

    if (t1.minute < t2.minute) {
        return NSOrderedAscending;
    }
    // hour and minute are the same
    if (t1.second > t2.second) {
        return NSOrderedDescending;
    }

    if (t1.second < t2.second) {
        return NSOrderedAscending;
    }
    return NSOrderedSame;

}];

if ([times indexOfObject:currentTime] == 1) {
    NSLog(@"We are Open!");
} else {
    NSLog(@"Sorry, we are closed!");
}
person vikingosegundo    schedule 11.04.2015
comment
Чувак, посмотри мой РЕДАКТИРОВАТЬ в вопросе, я попробовал твой фрагмент кода, он показывает мне, что Sorry, we are closed! мое время открытия 8 и 45 в AM, а время закрытия 4 и 43 в PM, а текущее время 3:30 - person Krunal; 11.04.2015
comment
4:43 это 24 часа. попробуйте 16:43. и я не твой чувак. - person vikingosegundo; 12.04.2015
comment
Спасибо за помощь, проблема решена +1 за ваш ответ - person Krunal; 12.04.2015
comment
Вы пощадили мое время! Спасибо большое ! - person Lapinou; 26.01.2017

Попробуй это -

NSString *startTimeString = @"08:00 AM";
NSString *endTimeString = @"06:00 PM";

NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"hh:mm a"];

NSString *nowTimeString = [formatter stringFromDate:[NSDate date]];

int startTime   = [self minutesSinceMidnight:[formatter dateFromString:startTimeString]];
int endTime  = [self minutesSinceMidnight:[formatter dateFromString:endTimeString]];
int nowTime     = [self minutesSinceMidnight:[formatter dateFromString:nowTimeString]];;


if (startTime <= nowTime && nowTime <= endTime)
{
    NSLog(@"Time is between");
}
else {
    NSLog(@"Time is not between");
}


-(int) minutesSinceMidnight:(NSDate *)date
{
    NSDateComponents *components = [[NSCalendar currentCalendar] components:NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:date];
    return 60 * (int)[components hour] + (int)[components minute];        
}

Проверьте скриншот -

введите здесь описание изображения

person Uttam Sinha    schedule 10.04.2015
comment
спасибо за ответ, но это дает мне ошибку здесь int nowTime = (currHr*60)+currtMin; неявное преобразование теряет целочисленную точность long в int - person Krunal; 10.04.2015
comment
я уже упоминал о преобразовании NSInteger в (int). int nowTime = (int)(currHr*60)+(int)currtMin - person Uttam Sinha; 10.04.2015
comment
Чувак, целочисленное преобразование работает, но ваше второе условие if становится ложным, когда nowTime 1:15pm между 8:35am и 4.:43pm :( - person Krunal; 11.04.2015
comment
Прежде всего, вы должны использовать 24-часовой формат, и логика am/pm не будет работать при проверке времени, попадает ли оно между временем начала и временем окончания или нет. Почему это, потому что, если вы проверите время 16:00 между 4:00 и 17:00. Преобразование минут в 4:00 и 16:00 даст одинаковое значение, и логика здесь не работает. Так что подумайте над этим и используйте 24-часовой формат. Если вы действительно хотите использовать логику am/pm, используйте дату также со временем, существует другая логика для проверки даты и времени :) - person Uttam Sinha; 11.04.2015
comment
Время идет с сервера, я ничего не могу изменить в этом :( единственное исправление startTime всегда в am и endTime в pm теперь не могли бы вы помочь мне с логикой? - person Krunal; 11.04.2015
comment
Братан, твой код дает сбой -[__NSCFString timeIntervalSinceReferenceDate]: unrecognized selector sent to instance 0x7fbfebfb6ae0 здесь NSDateComponents *components = [gregorian components:unitFlags fromDate:date]; значение unitFlag is 96 и date is 8:16 - person Krunal; 11.04.2015
comment
проверьте прикрепленный скриншот. код работает нормально для меня без сбоев. вы можете проверить с помощью другого идентификатора NSCalendarIdentifierGregorian вместо NSCalendarIdentifierIndian. Я проверил оба идентификатора. - person Uttam Sinha; 11.04.2015
comment
проверьте обновленный код. без какого-либо идентификатора также код отлично работает с ожидаемым результатом :) - person Uttam Sinha; 11.04.2015
comment
Давайте продолжим обсуждение в чате. - person Krunal; 11.04.2015
comment
Спасибо за помощь, проблема решена +1 за ваш ответ - person Krunal; 12.04.2015