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 <Foundation/Foundation.h>
 
@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");
}

Cette entrée a été publiée dans Pro, avec comme mot(s)-clef(s) , , . Vous pouvez la mettre en favoris avec ce permalien.

3 réponses à Comparer deux NSDate

  1. lezard dit :

    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.)

  2. 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.

  3. Pierre dit :

    J’aime aussi toujours la bonne vieille façon prédicative permise grâce au préprocesseur de C:

    Dans le fichier .h:

    #define isEarlierThan(d1,d2) ([d1 compare:d2] == NSOrderedAscending)
    #define isLaterThan(d1,d2) ([d1 compare:d2] == NSOrderedDescending)
    #define isEarlierThanOrEqualTo(d1,d2) (!([d1 compare:d2] == NSOrderedDescending))
    #define isLaterThanOrEqualTo(d1,d2) (!([d1 compare:d2] == NSOrderedAscending))

    On utilise alors:

    if (isEarlierThan(self,date)) {

    }

    Et on peut facilement les étendre aux autres prédicats: Egal, Entre, etc.

    ;o)

    Merci bien pour le truc !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>