2015-01-13 1 views
7

В прошлом я использовал функцию ниже, чтобы добавить определенный интервал времени с использованием NSDateComponents к существующей дате.Как добавить несколько недель в NSDate?

(NSDate *)dateByAddingComponents:(NSDateComponents *)comps 
          toDate:(NSDate *)date 
         options:(NSCalendarOptions)opts 

От iOS8 значение недели не рекомендуется для NSDateComponents, что означает, что я не могу добиться того, что я хочу сделать: создать новый NSDate путем добавления определенного количества недель к данному NSDate.

Любая помощь была бы принята с благодарностью.

+2

Неделя 7 дней. –

+0

Вы пробовали 'weekOfYear'? – zaph

ответ

6

Обновление: Как сказал в своем ответе Зафис, Apple рекомендует использовать weekOfYear или weekOfMonth вместо ответа, предоставленного мной. Обратите внимание на ответ Zaph.


Вы, вероятно, быстро поймете, что вы overthinking, но вот как вы можете добавить некоторое количество недель до даты, даже если значение недели не рекомендуется, например:

NSDateComponents *comp = [NSDateComponents new]; 
int numberOfDaysInAWeek = 7; 
int weeks = 3; // <-- this example adds 3 weeks 
comp.day = weeks * numberOfDaysInAWeek; 

NSDate *date = [[NSCalendar currentCalendar] dateByAddingComponents:comp toDate:date options:0]; 
+0

Спасибо. Вы правы, я переусердствовал. – Rich

+0

Нет проблем. Это происходит :) –

+0

Извините, но этот ответ может быть ошибочным, поскольку он предполагает, что каждая неделя имеет ровно 7 дней. Ответ @Zaph более безопасен. – rmaddy

-1

Вы можете добавить категорию на NSDate со следующим методом:

- (NSDate *) addWeeks:(NSInteger)weeks 
{ 
    NSCalendar *gregorian=[[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
    NSDateComponents *components=[[NSDateComponents alloc] init]; 
    components.day = weeks * 7; 

    return [gregorian dateByAddingComponents:components toDate:self options:0]; 
} 
+0

Была причина, по которой Apple удалила «неделю», не добавляйте ее обратно в «NSDate» в другой форме, когда все, что вам нужно, это использовать «weekOfYear», как предлагают документы. – zaph

16

weekOfYear Просто используйте:

Apple, документы для NSDateComponentsweek:

Deprecation Заявление
Использование weekOfYear или weekOfMonth вместо этого, в зависимости от того, что вы собираетесь.

NSDate *date = [NSDate date]; 
NSDateComponents *comp = [NSDateComponents new]; 
comp.weekOfYear = 3; 
NSDate *date1 = [[NSCalendar currentCalendar] dateByAddingComponents:comp toDate:date options:0]; 
NSLog(@"date: %@", date); 
NSLog(@"date1: %@", date1); 

Выход:

  
date: 2015-01-13 04:06:26 +0000 
date1: 2015-02-03 04:06:26 +0000 

Если вы используете week вы получите предупреждение:

'неделя' осуждается: первый осуждается в ... - Использование weekOfMonth или weekOfYear , в зависимости от которого вы имеете в виду

При использовании weekOfMonth или weekOfYear в качестве дельта они работают одинаково. Если они отличаются друг от друга, это когда они используются для получения номера недели, где вы получите неделю месяца с диапазоном 6 или недели года с диапазоном 53.

0

Я предпочитаю использовать dateByAddingUnit. Это более интуитивно понятно

return [NSDate[[NSCalendar currentCalendar] dateByAddingUnit:NSCalendarUnitMonth value:3 toDate:toDate options:0];