Будьте очень осторожны с DST.Это отличается для разных часовых поясов. И это происходит в полночь Я полагаю, что если вы позвоните [дата NSCalendar путем добавления компонентов: toDate: options], а ваша дата будет между 11-12 вечера, вы рискуете пропустить или повторно запустить день из-за летнего времени.Чтобы обойти это, рекомендуется изменить дату на полдень дня, а затем добавить день.
// 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];
Я не уверен насчет параметров: настройка 0, но я проверил это довольно тщательно.Я использую его, чтобы получить массив с датами 10 дней.Это дает правильную упаковку вокруг различных разрывов дня / месяца / года.Проверьте SunPose Rise Set в магазине приложений, если хотите протестировать его.(да, это бесплатно)