2 votes

NSDate et le jour suivant

J'avais l'habitude d'utiliser l'horodatage et d'ajouter 86400 secondes ( 24 * 60 * 60 ). Comme j'ai lu une question récente sur stackoverflow notant que ce n'est pas correct pour tous les jours, je veux changer cela.

J'ai donc décidé d'utiliser les NSDateComponents. Je récupère simplement le jour en cours et j'ajoute 1. Je me demande maintenant si c'est vraiment "intelligent". Par exemple, si le jour est égal à 31, est-ce qu'il met le jour à 1 et le mois à +1 (ou quand il est à 12 à 1 à nouveau) ? Je peux le faire manuellement mais cela ne fonctionnerait correctement que pour le calendrier grégorien donc je ne sais pas vraiment si c'est une bonne solution non plus

3voto

Dave DeLong Points 156978

Il est intelligent, à moins que vous ne vouliez qu'il soit stupide.

De la documentation pour -[NSCalendar dateByAddingComponents:toDate:options] :

Si vous ne spécifiez aucune option (vous passez 0), le dépassement d'une unité se répercute sur les unités supérieures (comme dans une addition classique).

Si vous l'avez fait no veulent que les unités débordent sur les unités supérieures, alors vous passeriez ". NSWrapCalendarComponents "comme la valeur de l'élément options: paramètre.

0voto

Suz Points 730

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)

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