Comment générer 30 jours comme tableau à l'aide de NSCalendar ou NSDate?
-
14-11-2019 - |
Question
J'essaie de créer un éventail de 30 jours qui prend en considération l'heure d'été, l'année de saut, etc. J'ai actuellement un générateur qui fait un éventail de jours, mais cela ne prend pas en compte des changements de temps spéciaux et de l'année, changements de mois. Voici mon code actuel:
NSMutableArray* dates = [[NSMutableArray alloc] init];
int numberOfDays=30;
NSDate *startDate=[NSDate date];
NSDate *tempDate=[startDate copy];
for (int i=0;i<numberOfDays;i++) {
NSLog(@"%@",tempDate.description);
tempDate=[tempDate dateByAddingTimeInterval:(60*60*24)];
[dates addObject:tempDate.description];
}
NSLog(@"%@",dates);
Quelle est la meilleure façon de créer un générateur pour parcourir le calendrier pour récupérer les 30 prochains jours à partir de la date d'aujourd'hui et le tableau devrait inclure la date d'aujourd'hui et les 29 prochains jours. Mon code actuel fonctionne comme je l'ai dit, mais ce n'est pas totalement précis. Merci
La solution
Vous l'avez presque; Juste quelques modifications:
int numberOfDays=30;
NSDate *startDate=[NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *offset = [[NSDateComponents alloc] init];
NSMutableArray* dates = [NSMutableArray arrayWithObject:startDate];
for (int i = 1; i < numberOfDays; i++) {
[offset setDay:i];
NSDate *nextDay = [calendar dateByAddingComponents:offset toDate:startDate options:0];
[dates addObject:nextDay];
}
[offset release];
NSLog(@"%@",dates);
Cela créera un tableau de NSDate
objets. Sur ma machine, cela enregistre:
EmptyFoundation[4302:903] (
"2011-02-16 16:16:26 -0800",
"2011-02-17 16:16:26 -0800",
"2011-02-18 16:16:26 -0800",
"2011-02-19 16:16:26 -0800",
"2011-02-20 16:16:26 -0800",
"2011-02-21 16:16:26 -0800",
"2011-02-22 16:16:26 -0800",
"2011-02-23 16:16:26 -0800",
"2011-02-24 16:16:26 -0800",
"2011-02-25 16:16:26 -0800",
"2011-02-26 16:16:26 -0800",
"2011-02-27 16:16:26 -0800",
"2011-02-28 16:16:26 -0800",
"2011-03-01 16:16:26 -0800",
"2011-03-02 16:16:26 -0800",
"2011-03-03 16:16:26 -0800",
"2011-03-04 16:16:26 -0800",
"2011-03-05 16:16:26 -0800",
"2011-03-06 16:16:26 -0800",
"2011-03-07 16:16:26 -0800",
"2011-03-08 16:16:26 -0800",
"2011-03-09 16:16:26 -0800",
"2011-03-10 16:16:26 -0800",
"2011-03-11 16:16:26 -0800",
"2011-03-12 16:16:26 -0800",
"2011-03-13 16:16:26 -0700",
"2011-03-14 16:16:26 -0700",
"2011-03-15 16:16:26 -0700",
"2011-03-16 16:16:26 -0700",
"2011-03-17 16:16:26 -0700"
)
Notez comment le fuseau horaire décalé change le 13 mars à partir de -0800
à -0700
. C'est l'heure d'été. :)
Autres conseils
un code pour mon sidenote ci-dessus:
- (NSRange) daysInMonth:(NSDate*)date {
NSCalendar* cal = [NSCalendar currentCalendar];
NSDateComponents *comps = [cal components:(NSYearCalendarUnit|NSMonthCalendarUnit)
fromDate:(date != nil) ? date: self.currentMonth];
NSRange range = [cal rangeOfUnit:NSDayCalendarUnit
inUnit:NSMonthCalendarUnit
forDate:[cal dateFromComponents:comps]];
return range;
}