2010-01-03 20 views
9

Básicamente, quiero averiguar si es el día siguiente. Por lo tanto, estoy almacenando la fecha actual (por ejemplo, 2 de enero) constantemente en un plist. Pero la próxima vez que el usuario abra la aplicación, si la fecha ha cambiado (por ejemplo, el 3 de enero), quiero hacer algo. Tenga en cuenta que una simple verificación de orden ascendente no funcionaría porque no quiero saber si una fecha es posterior a otra fecha, si la diferencia es solo en horas. Necesito poder diferenciar el 2 de enero, 11:50 y el 3 de enero, 2:34 pero no el 3 de enero, 2:34 y el 3 de enero, 5:12.¿Cómo se pueden comparar dos fechas (solo fechas, no tiempo) en cacao?

Respuesta

24

uso el siguiente que encontré SO:

- (BOOL)isSameDay:(NSDate*)date1 otherDay:(NSDate*)date2 { 
    NSCalendar* calendar = [NSCalendar currentCalendar]; 

    unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; 
    NSDateComponents* comp1 = [calendar components:unitFlags fromDate:date1]; 
    NSDateComponents* comp2 = [calendar components:unitFlags fromDate:date2]; 

    return [comp1 day] == [comp2 day] && 
    [comp1 month] == [comp2 month] && 
    [comp1 year] == [comp2 year]; 
} 
+0

respuesta original contiene código obsoleto, de cambio: unitFlags sin signo = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; a esto: unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; – Borbea

+0

Actualizó la publicación. ¡Gracias! –

-2

Uso NSCalendarDate en lugar de NSDate, y comparar lo que se conviertan de la -dayOfCommonEra

@implementation NSDate (sameDayOrNot) 

- (BOOL) sameDayAsDate:(NSDate *) otherDate 
{ 
NSCalendarDate *date1 = [[NSCalendarDate alloc] initWithTimeInterval:0 sinceDate:self]; 
NSCalendarDate *date2 = [[NSCalendarDate alloc] initWithTimeInterval:0 sinceDate:otherDate]; 
BOOL result = ([date1 dayOfCommonEra] == [date2 dayOfCommonEra]); 
[date1 release]; 
[date2 release]; 
return result; 
} 

@end 
+0

NSCalendarDate está en desuso – Abizern

+0

Aún no, no lo es. – NSResponder

+1

Uh, sí, es http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/DatesAndTimes/Articles/LegacyNSCalendarDate.html Obsoleto no es lo mismo que eliminar. Además, la pregunta no es sobre verificar la equivalencia de dos fechas, sino cómo saber si están en días diferentes. – Abizern

0

Mirando el Date Time Programming Guide le da un ejemplo de cómo para calcular la diferencia entre dos fechas como por componente: por ejemplo:

NSDate *startDate = ...; 
NSDate *endDate = ...; 

NSCalendar *gregorian = [[NSCalendar alloc] 
    initWithCalendarIdentifier:NSGregorianCalendar]; 

NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit; 

NSDateComponents *components = [gregorian components:unitFlags 
    fromDate:startDate 
    toDate:endDate options:0]; 
NSInteger months = [components month]; 
NSInteger days = [components day]; 
-1

Mi versión basada en la de Neils (advertencia: no probados):

La mía es más similar a - (NSComparisonResult)compare: en NSDate. Para comprobar si hay días en igualdad de condiciones, hacer [myDate compareDayMonthAndYear:otherDate] == NSOrderedSame

- (NSComparisonResult)compareDayMonthAndYear:(NSDate *)date 
{ 
    NSCalendar *calendar = [NSCalendar currentCalendar]; 

    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 
    NSDateComponents *selfComponents = [calendar components:unitFlags fromDate:self]; 
    NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date]; 

    BOOL dayIsEqual = (selfComponents.day == dateComponents.day && selfComponents.month == dateComponents.month && selfComponents.year == dateComponents.year); 
    if (dayIsEqual) { 
     return NSOrderedSame; 
    } 
    return [self compare:date]; 
}