Comparer deux NSDate
Il est souvent utile de comparer deux NSDate dans le temps. Il s’agit de savoir si une date est antérieure ou postérieure à une autre. Le mécanisme offert par Apple pour les comparaisons de NSDate n’est pas des plus pratiques. Il faut utiliser la méthode compare:(NSDate*)date qui retourne un objet de type NSComparisonResult.
Cette méthode est une méthode standard de Foundation. Elle permet, grâce à des résultats de comparaison standardisés d’effectuer un tri sur des objets de façon générique. Oui, mais Apple ne prévoit pas de méthodes un peu plus haut niveau pour les simples comparaisons de dates. Voilà pourquoi j’ai écrit rapidement une addition de la classe NSDate permettant de comparer deux dates intuitivement. Les voici:
//
// NSDateAdditions.h
//
// Created by Julien on 28/05/09.
// Copyright 2009 Julien Quéré - Webd.fr. All rights reserved.
//
#import
@interface NSDate (NSDateAdditions)
-(BOOL) isLaterThanOrEqualTo:(NSDate*)date;
-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date;
-(BOOL) isLaterThan:(NSDate*)date;
-(BOOL) isEarlierThan:(NSDate*)date;
@end
// NSDateAdditions.m
//
// Created by Julien on 28/05/09.
// Copyright 2009 Julien Quéré - Webd.fr. All rights reserved.
//
#import "NSDateAdditions.h"
@implementation NSDate (NSDateAdditions)
-(BOOL) isLaterThanOrEqualTo:(NSDate*)date {
return !([self compare:date] == NSOrderedAscending);
}
-(BOOL) isEarlierThanOrEqualTo:(NSDate*)date {
return !([self compare:date] == NSOrderedDescending);
}
-(BOOL) isLaterThan:(NSDate*)date {
return ([self compare:date] == NSOrderedDescending);
}
-(BOOL) isEarlierThan:(NSDate*)date {
return ([self compare:date] == NSOrderedAscending);
}
@end
L’utilisation, quant à elle est on-ne-peut plus simple:
// Compare a NSDate (maDate) and the actual date
if([maDate isEarlierThanOrEqualTo:[NSDate date]])
{
NSLog(@"It's earlier or equal");
}
else
{
NSLog(@"It's later");
}

lezard a écrit
le 21 août 2009 à 10:26
très pratique merci.
à noter qu’il existe déjà:
- (BOOL)isEqualToDate:(NSDate *)anotherDate
(Returns a Boolean value that indicates whether a given object is an NSDate object and exactly equal the receiver.)
Julien Quéré a écrit
le 21 août 2009 à 10:30
Tout à fait lezard.
C’est pour ça que je ne l’ai pas codée
Mais les méthodes plus haut permettent de détecter les « < =" ou ">= » d’un coup sans avoir à appeler une autre méthode.