67 votes

Cocoa-Touch : Comment voir si deux NSDate sont dans le même jour ?

J'ai besoin de savoir si deux instances NSDate sont toutes deux du même jour.

Existe-t-il un moyen plus facile/meilleur de le faire que de récupérer les composants NSDate et de comparer le jour/mois/année ?

154voto

progrmr Points 32412

Si vous ciblez iOS 8 (et OS X 10.9) ou version ultérieure entonces La réponse de Joe est une meilleure solution en utilisant une nouvelle méthode dans NSCalendar juste à cet effet :

-[NSCalendar isDate:inSameDayAsDate:]

Pour iOS 7 ou antérieur : NSDateComponents est ma préférence. Que diriez-vous de quelque chose comme ça ?

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

    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
    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];
}

24voto

Ben Lachman Points 1206

(Remarque : consultez la réponse de Joe pour connaître la bonne façon de procéder sous iOS 8+).

J'utilise simplement un formateur de date :

NSDateFormatter *dateComparisonFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateComparisonFormatter setDateFormat:@"yyyy-MM-dd"];

if( [[dateComparisonFormatter stringFromDate:firstDate] isEqualToString:[dateComparisonFormatter stringFromDate:secondDate]] ) {
    …
}

HTH.

11voto

aapierce Points 642

J'aime la solution de progrmr, mais j'irais encore plus loin et je ferais une catégorie de NSDate qui fournit cette méthode. Cela rendra votre code légèrement plus lisible, et vous n'aurez pas besoin de copier et coller la méthode dans chaque nouvelle classe qui pourrait en avoir besoin - importez simplement le fichier d'en-tête.

NSDate+SameDay.h

@interface NSDate (SameDay)
- (BOOL)isSameDayAsDate:(NSDate*)otherDate;
@end

NSDate+SameDay.m

#import "NSDate+SameDay.h"

@implementation NSDate (SameDay)

- (BOOL)isSameDayAsDate:(NSDate*)otherDate {

    // From progrmr's answer...
    NSCalendar* calendar = [NSCalendar currentCalendar];

    unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit;
    NSDateComponents* comp1 = [calendar components:unitFlags fromDate:self];
    NSDateComponents* comp2 = [calendar components:unitFlags fromDate:otherDate];

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

@end

Ensuite, après avoir importé NSDate+SameDay.h dans votre classe, vous pouvez l'utiliser comme suit :

if ([myFirstDate isSameDayAsDate:mySecondDate]) {
    // The two dates are on the same day...
}

7voto

fbrereto Points 21711

NSDateComponents me semble être la meilleure solution. Une autre tactique à essayer est de la relier à une CFDate, puis d'utiliser CFDateGetAbsoluteTime et d'effectuer une soustraction pour obtenir le temps qui sépare les deux dates. Vous devrez cependant faire quelques calculs supplémentaires pour déterminer si la différence de temps fait que les dates se trouvent le même jour.

5voto

Bruce Geerdes Points 126

J'utilise NSDateComponents pour supprimer l'aspect temporel et ensuite comparer. Quelque chose comme :

if ([[self beginningOfDay:date1] isEqualToDate:[self beginningOfDay:date2]]) 
{
...
}

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

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

    return [calendar dateFromComponents:comp];
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X