web-dev-qa-db-fra.com

Objectif C - calculer le nombre de jours entre deux dates

Duplicata possible:
Comment comparer deux dates, renvoyer un nombre de jours.

J'ai deux dates (comme NSString sous la forme "aaaa-mm-jj"), par exemple:

NSString *start = "2010-11-01";
NSString *end = "2010-12-01";

Je souhaite implémenter:

- (int)numberOfDaysBetween:(NSString *)startDate and:(NSString *)endDate {

}

Merci!

56
CodeGuy
NSString *start = @"2010-09-01";
NSString *end = @"2010-12-01";

NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"yyyy-MM-dd"];
NSDate *startDate = [f dateFromString:start];
NSDate *endDate = [f dateFromString:end];

NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *components = [gregorianCalendar components:NSCalendarUnitDay
                                                    fromDate:startDate
                                                      toDate:endDate
                                                     options:0];

components détient maintenant la différence.

NSLog(@"%ld", [components day]);
170
vikingosegundo

Il existe un guide complet sur la programmation de la date et de l'heure. Voici un section pertinente qui vous donne une indication sur ce qu'il faut faire.

C'est d'où vient l'exemple de code dans l'autre question.

Essayez d'écrire quelque chose sur cette base, puis revenez si vous avez des questions spécifiques.

Modifier

D'accord. Voici comment j'écrirais le code dans sa forme la plus basique.

Tout d'abord, je voudrais étendre NSDate.

Le fichier d'en-tête:

//  NSDate+ADNExtensions.h

#import <Cocoa/Cocoa.h>


@interface NSDate (ADNExtensions)

- (NSInteger)numberOfDaysUntil:(NSDate *)aDate;

@end

Le fichier d'implémentation:

//  NSDate+ADNExtensions.m

#import "NSDate+ADNExtensions.h"


@implementation NSDate (ADNExtensions)


- (NSInteger)numberOfDaysUntil:(NSDate *)aDate {
    NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

    NSDateComponents *components = [gregorianCalendar components:NSDayCalendarUnit fromDate:self toDate:aDate options:0];

    return [components day];
}


@end

C'est un code très approximatif. Il n'y a aucune erreur de vérification ou de validation que la deuxième date est postérieure à la première.

Et puis je l'utiliserais comme ceci (fonctionnant sur un environnement Garbage Collected 64 bits):

NSDate *startDate = [NSDate dateWithString:@"2010-11-01 00:00:00 +0000"];
NSDate *endDate = [NSDate dateWithString:@"2010-11-02 00:00:00 +0000"];

NSInteger difference = [startDate numberOfDaysUntil:endDate];

NSLog(@"Diff = %ld", difference);

C'est vraiment dommage, car vous auriez appris beaucoup plus en publiant votre code et les sorties incorrectes et en obtenant une aide plus spécifique. Mais si vous voulez juste être un programmeur copier-coller; prenez ce code et bonne chance.

23
Abizern

Ce code semble bien fonctionner dans Swift 2:

func daysBetweenDate(startDate: NSDate, endDate: NSDate) -> Int
{
    let calendar = NSCalendar.currentCalendar()

    let components = calendar.components([.Day], fromDate: startDate, toDate: endDate, options: [])

    return components.day
}
6
iphaaw

implémentation de Swift 4

Appel de méthode:

let numberOfDays = daysBetweenDates(startDate: fileCreatedDate,endDate: date)

Implémentation de la méthode:

 func daysBetweenDates(startDate: Date, endDate: Date) -> Int {
        let daysBetween = Calendar.current.dateComponents([.day], from: startDate, to: endDate)
        print(daysBetween.day!)
        return daysBetween.day!
  }

Implémentation de l'objectif C:

Appel de méthode:

int numberOfDaysSinceFileCreation = [self daysBetweenDates: fileCreatedDate
                                                                   currentDate: today];

Implémentation de la méthode:

- (int) daysBetweenDates: (NSDate *)startDate currentDate: (NSDate *)endDate
{
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *dateComponent = [calendar components:NSCalendarUnitDay fromDate:startDate toDate:endDate options:0];

    int totalDays = (int)dateComponent.day;
    return totalDays;

}
5
Naishta

Code ObjC:

NSDateComponents *dateComponent = [calender components:NSCalendarUnitDay fromDate:startDate toDate:endDate options:0];

Résultat:

int totalDays = (int)dateComponent.day;
3
Gobi M

Swift 3:

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
let start = formatter.date(from: "2010-09-01")!
let end = formatter.date(from: "2010-12-01")!
let days = Calendar.current.dateComponents([.day], from: start, to: end).day!
3
Blixt