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!
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]);
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.
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
}
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;
}
Code ObjC:
NSDateComponents *dateComponent = [calender components:NSCalendarUnitDay fromDate:startDate toDate:endDate options:0];
Résultat:
int totalDays = (int)dateComponent.day;
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!