2010-01-03 8 views
9

Fondamentalement, je veux savoir si c'est le jour suivant. Donc, je stocke la date actuelle (par exemple Jan 2) constamment dans un plist. Mais la prochaine fois que l'utilisateur ouvre l'application, si la date a changé (par exemple Jan 3), je veux faire quelque chose. Notez qu'une simple vérification ascendante d'ordre ne fonctionnerait pas parce que je ne veux pas savoir si une date est postérieure à une autre date, si la différence est seulement en heures. Je dois être en mesure de différencier Jan 2 11h50 et Jan 3 2:34 mais pas Jan 3 2:34 et Jan 3 5:12.Comment comparer deux dates (dates seulement, pas le temps) dans le cacao?

Répondre

24

J'utilise ce qui suit que j'ai trouvé 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

réponse originale contient du code désapprouvée, échange: unitFlags non signés = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; à ceci: unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; – Borbea

+0

Mise à jour du post. Merci! –

-2

Utilisation NSCalendarDate au lieu de NSDate et comparer ce qu'ils reviennent de -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 obsolète – Abizern

+0

Pas encore, ce n'est pas le cas. – NSResponder

+1

Euh, oui c'est http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/DatesAndTimes/Articles/LegacyNSCalendarDate.html Déconseillé n'est pas la même chose que supprimé. En outre, la question n'est pas de vérifier l'équivalence de deux dates, mais de savoir si elles sont à des dates différentes. – Abizern

0

En regardant le Date Time Programming Guide vous donne un exemple de la façon dont pour calculer la différence entre deux dates par élément: par exemple:

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

Ma version basée sur Neils '(avertissement: non testé):

Mine est plus similaire à - (NSComparisonResult)compare: sur NSDate. Pour vérifier les jours étant égales par ailleurs, faire [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]; 
}