2011-03-16 15 views
5

¿Cómo compararía solo los componentes de año-mes-día de 2 NSDates?Comparando ciertos componentes de NSDate?

+0

posible duplicado de [Comparar NSDate objetos sólo en términos de día mes año] (http://stackoverflow.com/questions/3432700/compare-nsdate-objects-only-in -terms-of-year-month-day) –

Respuesta

11

Así que aquí es como usted lo haría:

NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSInteger desiredComponents = (NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit); 

NSDate *firstDate = ...; // one date 
NSDate *secondDate = ...; // the other date 

NSDateComponents *firstComponents = [calendar components:desiredComponents fromDate:firstDate]; 
NSDateComponents *secondComponents = [calendar components:desiredComponents fromDate:secondDate]; 

NSDate *truncatedFirst = [calendar dateFromComponents:firstComponents]; 
NSDate *truncatedSecond = [calendar dateFromComponents:secondComponents]; 

NSComparisonResult result = [truncatedFirst compare:truncatedSecond]; 
if (result == NSOrderedAscending) { 
    //firstDate is before secondDate 
} else if (result == NSOrderedDescending) { 
    //firstDate is after secondDate 
} else { 
    //firstDate is the same day/month/year as secondDate 
} 

Básicamente, tomamos las dos fechas, cortamos sus bits de horas-minutos-segundos, y el que volvemos de nuevo en fechas. Luego comparamos esas fechas (que ya no tienen un componente de tiempo, solo un componente de fecha) y vemos cómo se comparan entre sí.

ADVERTENCIA: escrito en un navegador y no compilado. Implementador de advertencias

4

Salida este tema NSDate get year/month/day

Una vez que usted saca el día/mes/año, se puede compararlos como enteros.

Si no te gusta ese método

su lugar, se podría intentar esto ..

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 

[dateFormatter setDateFormat:@"yyyy"]; 
int year = [[dateFormatter stringFromDate:[NSDate date]] intValue]; 

[dateFormatter setDateFormat:@"MM"]; 
int month = [[dateFormatter stringFromDate:[NSDate date]] intValue]; 

[dateFormatter setDateFormat:@"dd"]; 
int day = [[dateFormatter stringFromDate:[NSDate date]] intValue]; 
  • Y de otra manera ...

    NSDateComponents *dateComp = [calendar components:unitFlags fromDate:date]; 
    
    NSInteger year = [dateComp year]; 
    
    NSInteger month = [dateComp month]; 
    
    NSInteger day = [dateComp day]; 
    
+0

'NSCalendar' funciona en iOS –

+0

Impresionante, había leído en algún lado que podría no ser así, pero gracias por la verificación. –

0

Desde iOS 8 puede usar el método -compareDate:toDate:toUnitGranularity: de NSCalendar.

De esta manera:

NSComparisonResult comparison = [[NSCalendar currentCalendar] compareDate:date1 toDate:date2 toUnitGranularity:NSCalendarUnitDay];