2012-01-25 9 views
11

Quiero comparar dos NSDates con NOW ([NSDate date]).Comparando el tiempo de dos NSDates, ignorando el componente de fecha

NSDate *date1 = [NSDate dateWithString:@"1982-02-12 07:00:00 +0100"]; 
NSDate *now = [NSDate dateWithString:@"2012-01-25 10:19:00 +0100"]; //example 
NSDate *date2 = [NSDate dateWithString:@"1989-02-12 15:00:00 +0100"]; 

Me gustaría comprobar si ahora es entre date1 y date2. En el ejemplo anterior, este es el caso. El componente de fecha debe ignorarse por completo, por lo que solo se debe comparar el componente de tiempo. ¿Cómo podría lograr esto?

¡Gracias de antemano!

+0

duplicados de duplicado: http://stackoverflow.com/questions/8276187/determine-if-todays-date-is-in-a-range-of-two-dates-on-ios – Sarah

+0

posible duplicado de [Comparación del tiempo en NSDate] (http://stackoverflow.com/questions/3773279/comparing-time-in-nsdate) – dasblinkenlight

Respuesta

26
unsigned int flags = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond; 
NSCalendar* calendar = [NSCalendar currentCalendar]; 

NSDateComponents* components = [calendar components:flags fromDate:date1]; 

NSDate* timeOnly = [calendar dateFromComponents:components]; 

Esto le dará un objeto de fecha donde todo pero las horas/minutos/segundos se han reiniciado con un valor común. Luego puede usar las funciones estándar de comparar NSDate en ellos.

Para referencia, aquí es la pregunta opuesta a la suya: Comparing two NSDates and ignoring the time component

+0

Gracias Adam. Solo hay una cosa: ¡después de todos los cálculos, los componentes de tiempo también se cambian! Los tiempos se restan en 20 minutos. ¿Cómo es esto posible? – Rens

+1

Curioso, 20 min es un desplazamiento impar ... Este * podría * ser algo relacionado con cambios de calendario desde 1/1/1. Lo intenté yo mismo y aunque el tiempo mostrado permaneció igual, la compensación de GMT (por ejemplo, la zona horaria) cambió. Intente agregar '[components setYear: 1980];' después de 'NSDateComponents * components = ...' y verifique el efecto (no ha habido cambios en el calendario desde 1980, escogí el año más o menos aleatoriamente). Para mí, eso eliminó la discrepancia de compensación GMT. – CRD

+0

Gracias, pero ¿cómo comparar una hora que comienza a las 8:00 p.m. y termina a la 1:00 a.m. sin usar la fecha? – Filippo

-2
NSDateFormatter* formatterDate = [[[NSDateFormatter alloc] init] autorelease]; 

    formatterDate.dateStyle = NSDateFormatterMediumStyle; // whatever format you like 

    NSDate *first_Date = [formatterDate dateFromString:@""]; 
    NSDate *second_Date = [formatterDate dateFromString:@""]; 
    NSDate *todaysDate = [NSDate date]; 


    NSTimeInterval timeIntFormFirstDate = [todaysDate timeIntervalSinceDate:First_Date]; 
    NSTimeInterval timeIntFronLastDate = [second_Date timeIntervalSinceDate:todaysDate]; 

    int interval1 = timeIntFormFirstDate/60; 
    int interval2 = timeIntFronLastDate/60; 

    if (interval1 >0 && interval2 >0) 
    { 
     NSLog(@"Today's date is between first and second date"); 
    } 
+0

Pero eso no está ignorando el componente de fecha ¿no? – Rens

1

Se puede crear una fecha que representa el inicio de hoy y añadir el tiempo que los componentes a él para obtener las fechas límite.

NSDate *now = [NSDate date]; 
NSDate *startOfToday; 
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&startOfToday interval:NULL forDate:now]; 


NSDateComponents *startComps = [[NSDateComponents alloc] init]; 
startComps.hour = 7; 
startComps.minute = 30; 

NSDateComponents *endComps = [[NSDateComponents alloc] init]; 
endComps.hour = 20; 

NSDate *startDate = [[NSCalendar currentCalendar] dateByAddingComponents:startComps toDate:startOfToday options:0]; 
NSDate *endDate = [[NSCalendar currentCalendar] dateByAddingComponents:endComps toDate:startOfToday options:0]; 

if ([startDate timeIntervalSince1970] < [now timeIntervalSince1970] && [now timeIntervalSince1970] < [endDate timeIntervalSince1970]) { 
    NSLog(@"good"); 
} 
+0

hey esto es genial Voy a reutilizar este código, cómo voy a hacer una función de él que quiero pasar en el startComps.hour/minute y end.hour/minute y luego usar el enunciado if fuera de la función que estaba intentando esto '- (void) getStartTime: (NSDateComponents *) startComps getEndTime: (NSDateComponents *) endComps { NSDate * now = [NSDate date]; NSDate * startOfToday; [[NSCalendar currentCalendar] rangeOfUnit: NSDayCalendarUnit startDate: & startOfToday interval: NULL forDate: now]; 'pero no funcionaba? –

+0

He agregado el código completo en la pregunta anterior aquí http://stackoverflow.com/questions/26476231/objective-c-compare-two-times –

Cuestiones relacionadas