2015-01-01 4 views
0

Учитывая некоторый startDate, я хотел бы дегенерировать x число последовательных дней после этого startDate. Я пытаюсь использовать следующий код:Создайте последовательную последовательность NSDates

// Generate dates 
self.days = [[NSMutableArray alloc] init]; 
NSDate *startDate = [NSDate date]; 

NSCalendar *theCalendar = [NSCalendar currentCalendar]; 
NSDateComponents *dayComponent = [[NSDateComponents alloc] init]; 
dayComponent.day = 1; 

for (int i = 1; i < self.mygoal.goalDays; i++) { 
    [self.days addObject:startDate]; 
    startDate = [theCalendar dateByAddingComponents:dayComponent toDate:startDate options:0]; 
} 

Вопрос: ли переназначение STARTDATE нормально, учитывая, что я добавляю тот же объект self.days?

ответ

3

Создание последовательности дат не так тривиально, как это звучит. На самом деле он покрыт отличным 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]; 
} 

Так что, да, переназначение технически хорошо, но в данном конкретном случае это может вызвать непредвиденные проблемы.

0

Это нормально, потому что вы фактически не добавляете тот же объект. dateByAddingComponents: возвращает новый объект, поэтому при назначении его STARTDATE вы заменяете ссылки на ваш старый объект для ссылки на новый

+0

это может вызвать проблемы, связанные с DST, как показано в WWDC2011 видео «Выполнение календарных вычислений» – vikingosegundo

Смежные вопросы