Verifique si la hora y la date son entre una date y hora en particular

Tengo 3 variables;

startDate – Wed Apr 12 endDate – Wed Jun 11 timeDuration – 11.00 am from 11.00 pm (esta es una secuencia, 11AM es la hora de inicio y 12PM es la hora de finalización)

1.) Ahora, necesito get la date y la hora actuales ( [NSDate date] ) y verificar si la date actual está entre la date de startDate y la date de endDate y luego verificar si la hora actual está entre la timeDuration la timeDuration (entre las 11.00am from 11.00pm timeDuration 11.00am from 11.00pm )

2.) Si la hora actual está entre la duración del time (entre las 11.00 am from 11.00 pm ), necesito calcular el time restante para los siguientes escenarios;

a.) Si la hora es a las 10 am, necesito calcular la hora a la hora de inicio, que es a las 11.00am (la respuesta es 1 hour ).

b.) Si la hora es 11.45AM , ya que el time es mayor que la hora de inicio (que era 11.00am ), necesito calcular el time restante hasta la hora de finalización (que es 11.00pm ).

c.) Si la hora es 11.45pm , ya que el time es mayor que la hora de finalización (que es 11.00 p.m.), necesito imprimir un NSLog que diga que se ha excedido el time.

La idea básica es convertir su date de startDate y date de endDate en el NSDate actual de un NSDate y compararlas con la date actual. Entonces, si la date actual está en el range adecuado, agrega las horas de inicio y finalización a la date actual para llegar a un punto específico en el time para los times de inicio y finalización. Una vez que tenga esas dates, puede usar los methods compare y timeIntervalSinceDate de NSDate para get los valores que necesita:

 // NOTE: NO error checking is being done in this code. // Starting variables NSString *startDateString = @"Wed Apr 12"; NSString *endDateString = @"Wed Jun 11"; NSString *timeDurationString = @"11.00 am from 11.00 pm"; // Get the current date NSDate *currentTime = [NSDate date]; NSCalendar *cal = [NSCalendar currentCalendar]; NSDateComponents *currentDateComps = [cal components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:currentTime]; // Add the current year onto our date string NSString *startDateStringWithYear = [NSString stringWithFormat:@"%@ %d", startDateString, currentDateComps.year]; NSString *endDateStringWithYear = [NSString stringWithFormat:@"%@ %d", endDateString, currentDateComps.year]; // Calculate NSDate's for start/endDate NSDateFormatter *formatter = [[NSDateFormatter alloc] init]; [formatter setDateFormat:@"EEE MM dd yyyy"]; NSDate *startDate = [formatter dateFromString:startDateStringWithYear]; NSDate *endDate = [formatter dateFromString:endDateStringWithYear]; // Return if today's date is not between the start and end dates if ([startDate compare:currentTime] == NSOrdenetworkingDescending || [endDate compare:currentTime] == NSOrdenetworkingAscending) { return; } // Break the timeDurationString into separate words NSArray *timeDurationStringWords = [timeDurationString componentsSeparatedByString:@" "]; // Calculate NSDate's for the start time for today: NSString *startTimeString = [timeDurationStringWords objectAtIndex:0]; currentDateComps.hour = [[startTimeString substringToIndex:2] intValue]; currentDateComps.minute = [[startTimeString substringFromIndex:3] intValue]; if ([[timeDurationStringWords objectAtIndex:1] isEqualToString:@"pm"]) { currentDateComps.hour += 12; } NSDate *startTime = [cal dateFromComponents:currentDateComps]; // And now the end time for today NSString *endTimeString = [timeDurationStringWords objectAtIndex:3]; currentDateComps.hour = [[endTimeString substringToIndex:2] intValue]; currentDateComps.minute = [[endTimeString substringFromIndex:3] intValue]; if ([[timeDurationStringWords objectAtIndex:4] isEqualToString:@"pm"]) { currentDateComps.hour += 12; } NSDate *endTime = [cal dateFromComponents:currentDateComps]; // Now we have what we really want: A specific start time, current time, and end time. // Check to see if we are waiting to start: if ([startTime compare:currentTime] == NSOrdenetworkingDescending) { NSTimeInterval minutesToStartTime = [startTime timeIntervalSinceDate:currentTime] / 60; NSLog(@"Start time is in %02d+%02d", (int)(minutesToStartTime / 60), (int)minutesToStartTime % 60); return; } // Check to see if we are late: if ([endTime compare:currentTime] == NSOrdenetworkingAscending) { NSLog(@"Time Exceeded"); return; } // We are between the two times: NSTimeInterval minutesToEndTime = [endTime timeIntervalSinceDate:currentTime] / 60; NSLog(@"End time is in %02d+%02d", (int)(minutesToEndTime / 60), (int)minutesToEndTime % 60); 

Puede usar - (NSComparisonResult)compare:(NSDate *)anotherDate
compare la date actual con startDate y endDate.

 NSComparisonResult enum { NSOrdenetworkingAscending = -1, NSOrdenetworkingSame, NSOrdenetworkingDescending }; 

Ejemplo:

 NSDate *currentDate = [NSDate date]; if (([currentDate compare:startDate ] == NSOrdenetworkingDescending) && ([currentDate compare:endDate ] == NSOrdenetworkingAscending)) { //currentDate is between startDate and endDate. } 

o eche un vistazo a esta solución por bbum .