Comtesting si la hora es anterior o posterior a dos veces de cadena de text guardada.

He almacenado dos veces en un dictionary NS. "Hora de inicio" es a las 22:30 y "Hora de finalización" es a las 4:00 a.m.

Necesito averiguar si la hora actual es antes de la hora de inicio, antes de la hora de finalización, o después de la hora de finalización y antes de la próxima vez que se inicie el time de inicio.

Estoy seguro de que estoy haciendo esto mucho más complicado de lo que debería ser, pero al tratar de ocultar todas las posibilidades, me he confundido por completo.

NSDictionary *noaudio = [[NSUserDefaults standardUserDefaults] objectForKey:@"NoSound"]; NSDateFormatter *tformat = [[NSDateFormatter alloc] init]; [tformat setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"]]; [tformat setDateFormat:@"HH:mm"]; date1 = [tformat dateFromString:[noaudio objectForKey:@"start"]]; date2 = [tformat dateFromString:[noaudio objectForKey:@"end"]]; date3 = [NSDate date]; 

¿Tendría que verificar las dates 1 y 2 contra 3?

Gracias por cualquier orientación sobre este.

Bueno, con solo dos veces y sin dates, solo puede averiguar si la hora actual es entre las horas de inicio y finalización. Esto se debe a que, en su ejemplo anterior (hora de inicio 22:30 y hora de finalización 04:00), ¿qué regresaría a las 13:00? Es tanto "después de la hora de finalización" (04:00) como "antes de la hora de inicio" (22:30) hoy.

Dicho esto, aquí hay una forma de verificar si la hora actual está entre las veces especificadas en dos dates. Puede hacer esto manteniendo todo como un NSDate (usando las operaciones del calendar), pero lo hace aún más complicado porque debe crear nuevos objects NSDate usando la date de hoy con los times especificados. No es demasiado difícil, pero no hay razón para hacerlo a less que los esté utilizando en otros lugares.

 // Take a date and return an integer based on the time. // For instance, if passed a date that contains the time 22:30, return 2230 - (int)timeAsIntegerFromDate:(NSDate *)date { NSCalendar *currentCal = [NSCalendar currentCalendar]; NSDateComponents *nowComps = [currentCal components:NSHourCalendarUnit|NSMinuteCalendarUnit fromDate:date]; return nowComps.hour * 100 + nowComps.minute; } // Check to see if the current time is between the two arbitrary times, ignoring the date portion: - (BOOL)currentTimeIsBetweenTimeFromDate1:(NSDate *)date1 andTimeFromDate2:(NSDate *)date2 { int time1 = [self timeAsIntegerFromDate:date1]; int time2 = [self timeAsIntegerFromDate:date2]; int nowTime = [self timeAsIntegerFromDate:[NSDate date]]; // If the times are the same, we can never be between them if (time1 == time2) { return NO; } // Two cases: // 1. Time 1 is smaller than time 2 which means that they are both on the same day // 2. the reverse (time 1 is bigger than time 2) which means that time 2 is after midnight if (time1 < time2) { // Case 1 if (nowTime > time1) { if (nowTime < time2) { return YES; } } return NO; } else { // Case 2 if (nowTime > time1 || nowTime < time2) { return YES; } return NO; } } 

¿Por qué no simplemente almacenar el NSDate en el NSDictionary? Entonces, puede usar timeIntervalSinceReferenceDate o timeIntervalSince1970 para get un NSTimeInterval (que en realidad es solo un doble) y hacer una comparación simple.

Si solo tiene momentos, es imposible saber si están en la misma date o no, así que no veo una solución general que funcione cuando la hora de inicio es antes de la medianoche y la hora de finalización es posterior …

En cualquier caso, incluso si no puede simplemente almacenar el NSDate (¿es este el caso? ¿Los times vienen de alguna fuente externa?), Su vida será mucho más simple si convierte a un doble y simplemente usa <y>.