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:

L’utilisation, quant à elle est on-ne-peut plus simple:

3 Responses to "Comparer deux NSDate"

Add Comment
  1. lezard

    21 août 2009 at 10 h 26 min

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

    Répondre
  2. Julien Quéré

    21 août 2009 at 10 h 30 min

    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.

    Répondre
  3. Pierre

    29 septembre 2010 at 4 h 25 min

    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 !

    Répondre

Submit a comment

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 class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">