155 votes

Nombre de jours entre deux NSDates

Comment pourrais-je déterminer le nombre de jours entre deux valeurs NSDate (en prenant également en compte le temps)?

Les valeurs de NSDate se présentent sous n'importe quelle forme [date de NSDate].

Plus précisément, lorsqu'un utilisateur entre dans l'état inactif de mon application iPhone, je stocke la valeur suivante:

 exitDate = [NSDate date];
 

Et quand ils ouvrent l'application, j'obtiens l'heure actuelle:

 NSDate *now = [NSDate date];
 

Maintenant, je voudrais mettre en œuvre les éléments suivants:

 -(int)numberOfDaysBetweenStartDate:exitDate andEndDate:now
 

414voto

Brian Points 10119

Voici une implémentation utilisée pour déterminer le nombre de jours calendaires entre deux dates:

 + (NSInteger)daysBetweenDate:(NSDate*)fromDateTime andDate:(NSDate*)toDateTime
{
    NSDate *fromDate;
    NSDate *toDate;

    NSCalendar *calendar = [NSCalendar currentCalendar];

    [calendar rangeOfUnit:NSDayCalendarUnit startDate:&fromDate
        interval:NULL forDate:fromDateTime];
    [calendar rangeOfUnit:NSDayCalendarUnit startDate:&toDate
        interval:NULL forDate:toDateTime];

    NSDateComponents *difference = [calendar components:NSDayCalendarUnit
        fromDate:fromDate toDate:toDate options:0];

    return [difference day];
}
 

118voto

Biosopher Points 819

Voici la meilleure solution que j'ai trouvé. Semble utiliser la Apple méthode approuvée pour la détermination de toute quantité d'unités entre NSDates.

- (int)daysBetween:(NSDate *)dt1 and:(NSDate *)dt2 {
    NSUInteger unitFlags = NSDayCalendarUnit;
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDateComponents *components = [calendar components:unitFlags fromDate:dt1 toDate:dt2 options:0];
    return [components day]+1;
}

E. g. si vous voulez les mois, alors vous pourriez inclure 'NSMonthCalendarUnit" comme un unitFlag.

De crédit à l'origine de blogueur, j'ai trouvé cette info ici (même si il y avait une petite erreur que j'ai corrigé ci-dessus): http://cocoamatic.blogspot.com/2010/09/nsdate-number-of-days-between-two-dates.html?showComment=1306198273659#c6501446329564880344

13voto

jki Points 1861

Je l'utilise comme méthode de catégorie pour la classe NSDate

 // returns number of days (absolute value) from another date (as number of midnights beween these dates)
- (int)daysFromDate:(NSDate *)pDate {
        NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        NSInteger startDay=[calendar ordinalityOfUnit:NSDayCalendarUnit
                                               inUnit:NSEraCalendarUnit
                                              forDate:self];
        NSInteger endDay=[calendar ordinalityOfUnit:NSDayCalendarUnit
                                             inUnit:NSEraCalendarUnit
                                            forDate:pDate];
        [calendar release];
        return abs(endDay-startDay);
 

8voto

orkoden Points 2262

J'avais besoin du nombre de jours entre deux dates, y compris le jour du début. Par exemple, les jours entre le 14-2-2012 et le 16-2-2012 donneraient un résultat de 3.

 + (NSInteger)daysBetween:(NSDate *)dt1 and:(NSDate *)dt2 {
        NSUInteger unitFlags = NSDayCalendarUnit;
        NSCalendar* calendar = [NSCalendar currentCalendar];
        NSDateComponents *components = [calendar components:unitFlags fromDate:dt1 toDate:dt2 options:0];
        NSInteger daysBetween = abs([components day]);
    return daysBetween+1;
}
 

Notez que l'ordre dans lequel vous fournissez les dates n'a pas d'importance. Il retournera toujours un nombre positif.

7voto

chris Points 317
 NSDate *lastDate = [NSDate date];
NSDate *todaysDate = [NSDate date];
NSTimeInterval lastDiff = [lastDate timeIntervalSinceNow];
NSTimeInterval todaysDiff = [todaysDate timeIntervalSinceNow];
NSTimeInterval dateDiff = lastDiff - todaysDiff;
 

dateDiff sera alors le nombre de secondes entre les deux dates. Il suffit de diviser par le nombre de secondes dans une journée.

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