Как сравнить время - PullRequest
       78

Как сравнить время

6 голосов
/ 22 марта 2011

Как сравнить время в Objective C?

if (nowTime > 9:00 PM) && (nowTime < 7:00 AM) 
{
  doSomething;
}

Ответы [ 6 ]

16 голосов
/ 22 марта 2011

Если вы хотите узнать текущий час и сравнить его с некоторыми значениями, вам придется использовать NSDate, NSDateComponents и NSCalendar.

NSDateComponents *components = [[NSCalendar currentCalendar] components:NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:[NSDate date]];
NSInteger currentHour = [components hour];
NSInteger currentMinute = [components minute];
NSInteger currentSecond = [components second];

if (currentHour < 7 || (currentHour > 21 || currentHour == 21 && (currentMinute > 0 || currentSecond > 0))) {
    // Do Something
}

Это проверит время между 9:00 и 7:00. Конечно, если вы захотите использовать другое время, вам придется немного изменить код.


Подробнее о NSDate , NSDateComponents и NSCalendar , чтобы узнать больше.

10 голосов
/ 13 марта 2013

Theres идеальная формула для этого. Просто для будущих ссылок

Ниже приведен пример кода:

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";

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

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

int nowTime = (int)((currHr*60)+currtMin);

if(nowTime >= formStTime && nowTime <= formEnTime) {
    // Do Some Nasty Stuff..
}
0 голосов
/ 02 июня 2015

Я использовал ответ, данный выше от ржи. Мне просто пришлось конвертировать мои 7:00 утра и 9:00 вечера в 24 часа. Вот метод, который я использовал

/**
Willl return YES if the Restaurant is OPEN at the Moment else NO
*/


-(BOOL) isShopOpen:(NSString *) startTime closeTime:(NSString *) endTime{

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

int stHr ;
int stMin ;
int enHr ;
int enMin ;


if([startTime containsString:@"PM"]){
    startTime = [startTime stringByReplacingOccurrencesOfString:@" PM" withString:@""];

    stHr=[[[startTime componentsSeparatedByString:@":"] objectAtIndex:0] intValue];
    stHr=stHr+12;

    stMin = [[[startTime componentsSeparatedByString:@":"] objectAtIndex:1] intValue];

}else{
    startTime = [startTime stringByReplacingOccurrencesOfString:@" AM" withString:@""];

    stHr=[[[startTime componentsSeparatedByString:@":"] objectAtIndex:0] intValue];
    stMin = [[[startTime componentsSeparatedByString:@":"] objectAtIndex:1] intValue];
}

if([endTime containsString:@"PM"]){
    endTime = [endTime stringByReplacingOccurrencesOfString:@" PM" withString:@""];

    enHr=[[[endTime componentsSeparatedByString:@":"] objectAtIndex:0] intValue];
    enHr=enHr+12;

    enMin = [[[startTime componentsSeparatedByString:@":"] objectAtIndex:1] intValue];

}else{
    endTime = [endTime stringByReplacingOccurrencesOfString:@" AM" withString:@""];

    enHr=[[[endTime componentsSeparatedByString:@":"] objectAtIndex:0] intValue];
    enMin = [[[startTime componentsSeparatedByString:@":"] objectAtIndex:1] intValue];
}

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

int nowTime = (currHr*60)+currtMin;

if(nowTime >= formStTime && nowTime <= formEnTime) {
    // Do Some Nasty Stuff..
    return YES;
}else{
    return NO;
}

}

0 голосов
/ 10 декабря 2014

Для проверки текущего времени или любого другого времени между двумя периодами ::

NSCalendar *calendar = [[NSCalendar alloc]
                        initWithCalendarIdentifier:NSGregorianCalendar];
NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit;
NSDateComponents *components = [calendar components:units fromDate:[NSDate date]];

return [self isDateComponent:components withinStartHour:startH startMin:startM endHour:endH endMin:endM];

-(BOOL)isDateComponent:(NSDateComponents*)components withinStartHour:(int)startH startMin:(int)startM endHour:(int)endH endMin:(int)endM
{
    if (endH < startH) {
        return (  [self isDateComponent:components betweenStartHour:startH startmin:startM endHour:23 endMin:59]  ||
                [self isDateComponent:components betweenStartHour:0 startmin:0 endHour:endH endMin:endM]  );
    }
    else {
        return [self isDateComponent:components betweenStartHour:startH startmin:startM endHour:endH endMin:endM];
    }


}



-(BOOL)isDateComponent:(NSDateComponents*)components betweenStartHour:(int)startH startmin:(int)startM endHour:(int)endH endMin:(int)endM
{

    int currentH = components.hour;
    int currentM = components.minute ;

    DDLogVerbose(@"start : %i-%i, end : %i-%i, current:%i-%i",startH,startM,endH,endM,currentH,currentM);
    startM  = startM + startH * 60;
    endM = endM + endH * 60;

    currentM = components.minute + currentH*60;

    if ( startM <= currentM && currentM < endM ) {
        return YES;
    }
    else {
        return NO;
    }


}
0 голосов
/ 01 октября 2012

Если кому-то нужно, это код для создания разделов в табличном представлении в соответствии с датой объектов.

Метод для получения дат на сегодня, вчера и т. Д. (Взят из класса ReMail проекта DateUtil):

#define DATE_UTIL_SECS_PER_DAY 86400

-(void)refreshData {
    //TODO(gabor): Call this every hour or so to refresh what today, yesterday, etc. mean
    NSCalendar *gregorian = [NSCalendar currentCalendar];
    self.today = [NSDate date];
    self.yesterday = [today dateByAddingTimeInterval:-DATE_UTIL_SECS_PER_DAY];
    self.lastWeek = [today dateByAddingTimeInterval:-6*DATE_UTIL_SECS_PER_DAY];
    self.todayComponents = [gregorian components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:today];
    self.yesterdayComponents = [gregorian components:(NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:yesterday];
    self.dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
}

Метод сортировки tableData для разделов табличного представления по дате:

// Sort tableData objects according to the date
    for (MCMessage *mcMessage in self.tableData) {
        NSDateComponents *components = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:mcMessage.dateTime];
        NSInteger day = [components day];
        NSInteger month = [components month];
        NSInteger year = [components year];

        NSLog(@"Day:%d, Month:%d, Year:%d. Today day:%d. Yesterday:%d", day, month, year, dateUtil.todayComponents.day, dateUtil.yesterdayComponents.day);

        if ((dateUtil.todayComponents.day == day) && (dateUtil.todayComponents.month == month) && (dateUtil.todayComponents.year == year))
        {
            [self.todayData addObject:mcMessage];
        }
        else if ((dateUtil.yesterdayComponents.day == day) && (dateUtil.yesterdayComponents.month == month) && (dateUtil.yesterdayComponents.year == year))
        {
            [self.yesterdayData addObject:mcMessage];
        }
        else
        {
            [self.soonerData addObject:mcMessage];
        }
    }
0 голосов
/ 22 марта 2011
NSDate *now = [NSDate date];
if (([now compare:earlierDateVariable] == NSOrderedDescending) && ([now compare:laterDateVariable] == NSOrderedAscending ))
{
    // Do something here...
}

Для установки более ранней и поздней даты, прямо из документации Apple, доступно здесь

NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:22];
[comps setMonth:03];
[comps setYear:2011];
[comps setHour:21];
[comps setMinute:00];
NSCalendar *gregorian = [[NSCalendar alloc]
    initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *earlierDateVariable = [gregorian dateFromComponents:comps];
[comps release];
[gregorian release];

И то же самое относится к более поздней дате ...

...