Создание последовательности дат не так тривиально, как это звучит. На самом деле он покрыт отличным WWDC2011 video «Выполнение расчётов календаря».
Вы добавляете каждый цикл в день до последней даты. Но на самом деле это не будет работать во времени с DST, если время в час, которое изменилось на день переключения, и на любые последующие дни, когда даты будут нулевыми.
Если вы вместо этого измените компоненты даты i на цикл и добавите его в исходное значение satrtdate, это повлияет только на день переключения DST.
Кроме того, вы можете установить час начала даты на что-то безопасное - как полдень - поскольку все переключатели выполняются в ночное время.
С учетом всего этого я хотел бы использовать что-то вроде этого, чтобы создать последовательность дней со временем, установленным для начала дня:
NSUInteger numberOfDays = 10;
NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *startDate = [cal dateFromComponents:({
NSDateComponents *comps = [[NSDateComponents alloc] init];
comps.year = 2015;
comps.month = 1;
comps.day = 2;
comps.hour = 12; // for DST-safety
comps;
})];
NSMutableArray *dates = [@[] mutableCopy];
for (NSUInteger i =0 ; i < numberOfDays; ++i) {
NSDateComponents *comps = [[NSDateComponents alloc] init];
comps.day = i;
NSDate *date = [cal dateByAddingComponents:comps
toDate:startDate
options:0];
// set date to beginning of day
[cal rangeOfUnit:NSCalendarUnitDay
startDate:&date
interval:NULL
forDate:date];
[dates addObject:date];
}
Так что, да, переназначение технически хорошо, но в данном конкретном случае это может вызвать непредвиденные проблемы.
это может вызвать проблемы, связанные с DST, как показано в WWDC2011 видео «Выполнение календарных вычислений» – vikingosegundo