¿Cómo verificar si la hora actual está dentro de un range especificado en ios?

Posible duplicado:
Determine si la hora local actual es entre dos veces (ignorando la parte de la date)

En iOS, ¿cómo puedo hacer lo siguiente?

Tengo dos objects NSDate que representan los horarios de apertura y cierre de una tienda. Los times dentro de estos objects son precisos, pero la date no está especificada (la tienda se abre y cierra al mismo time independientemente de la date). ¿Cómo puedo comprobar si la hora actual cae entre este marco de time?

Tenga en count que, si ayudara a que las horas de apertura y cierre estén en otro formatting que no NSDate objects NSDate , estoy bien con eso. Actualmente, estoy leyendo en una cadena de date como "12:30" de un file y usando formateador de date para crear un object coincidente de NSDate .

Actualización: tenga en count que esta solución es específica de su caso y asume que el horario de apertura de la tienda no abarca dos días. Por ejemplo, no funcionará si la hora de apertura va desde las 9 pm hasta las 10 am. Desde las 10 p. M. Es después de las 9 p. M. Pero no antes de las 10 p. M. (Dentro de un día). Así que tenlo en mente.

Cociné una function que le dirá si la hora de una date es entre otras dos dates (ignora el año, mes y día). También hay una segunda function de ayuda que le proporciona una nueva date de NS con los componentes de año, mes y día "neutralizados" (por ejemplo, establecer un valor estático).

La idea es establecer que los componentes de año, mes y día sean iguales entre todas las dates, de modo que la comparación solo dependerá del time.

No estoy seguro si es el enfoque más eficiente, pero funciona.

 - (NSDate *)dateByNeutralizingDateComponentsOfDate:(NSDate *)originalDate { NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease]; // Get the components for this date NSDateComponents *components = [gregorian components: (NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate: originalDate]; // Set the year, month and day to some values (the values are arbitrary) [components setYear:2000]; [components setMonth:1]; [components setDay:1]; return [gregorian dateFromComponents:components]; } - (BOOL)isTimeOfDate:(NSDate *)targetDate betweenStartDate:(NSDate *)startDate andEndDate:(NSDate *)endDate { if (!targetDate || !startDate || !endDate) { return NO; } // Make sure all the dates have the same date component. NSDate *newStartDate = [self dateByNeutralizingDateComponentsOfDate:startDate]; NSDate *newEndDate = [self dateByNeutralizingDateComponentsOfDate:endDate]; NSDate *newTargetDate = [self dateByNeutralizingDateComponentsOfDate:targetDate]; // Compare the target with the start and end dates NSComparisonResult compareTargetToStart = [newTargetDate compare:newStartDate]; NSComparisonResult compareTargetToEnd = [newTargetDate compare:newEndDate]; return (compareTargetToStart == NSOrdenetworkingDescending && compareTargetToEnd == NSOrdenetworkingAscending); } 

Utilicé este código para probarlo. Puede ver que el año, el mes y los días están configurados para algunos valores aleatorios y no afectan la verificación del time.

 NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; [dateFormatter setDateFormat:@"yyyy:MM:dd HH:mm:ss"]; NSDate *openingDate = [dateFormatter dateFromString:@"2012:03:12 12:30:12"]; NSDate *closingDate = [dateFormatter dateFromString:@"1983:11:01 17:12:00"]; NSDate *targetDate = [dateFormatter dateFromString:@"2034:09:24 14:15:54"]; if ([self isTimeOfDate:targetDate betweenStartDate:openingDate andEndDate:closingDate]) { NSLog(@"TARGET IS INSIDE!"); }else { NSLog(@"TARGET IS NOT INSIDE!"); }