Faites très attention à l'heure d'été. Elle est différente selon les fuseaux horaires. ET cela se passe à minuit Je pense que si vous appelez [NSCalendar date by addingComponents:toDate:options] et que votre date se situe entre 11 et 12 heures, vous risquez de rater ou de réexécuter un jour à cause de l'heure d'été. Pour contourner ce problème, je suggère de changer la date à midi le jour même, puis d'ajouter le jour.
// increment by 1 calendar day
// and convert back to NSDate objects
NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease];
[comps setDay:1];
NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[gregorian setTimeZone:self.myTimeZone]; // time zone of location;
// Use local noontime for the date to avoid problems around
// midnight, particularly near daylightsavings time discontinuities.
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents* dateComponents = [gregorian components:unitFlags fromDate:date];
dateComponents.hour = 12;
NSDate* noonDate = [gregorian dateFromComponents:dateComponents];
NSDate *newDate = [gregorian dateByAddingComponents:comps toDate:noonDate options:0];
Je ne suis pas sûr du réglage des options:0, mais j'ai testé cette méthode de manière assez approfondie. Je l'utilise pour obtenir un tableau de 10 jours de dates. Il permet d'entourer correctement les différentes discontinuités jour/mois/année. Allez voir SunPose Rise Set sur l'app store si vous voulez le tester. (oui, c'est gratuit)