2015-01-13 21 views
7

In passato ho utilizzato la funzione seguente per aggiungere un intervallo di tempo specifico utilizzando NSDateComponents a una data esistente.Come aggiungere un numero di settimane a un NSDate?

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

Da iOS 8 il valore settimana è deprecato per NSDateComponents, il che significa che non posso ottenere ciò che voglio fare: generare un nuovo NSDate con l'aggiunta di un certo numero di settimane ad un dato NSDate.

Qualsiasi aiuto sarebbe molto apprezzato.

+2

Una settimana è di 7 giorni. –

+0

Hai provato 'weekOfY'? – zaph

risposta

6

Aggiornamento: Come ha detto Zaph nella sua risposta, Apple consiglia effettivamente di utilizzare weekOfYear o weekOfMonth invece della risposta che ho fornito. Visualizza la risposta di Zaph per i dettagli.


Vi renderete conto probabilmente rapidamente che si sta overthinking, ma ecco come si può aggiungere un certo numero di settimane per una data, anche se il valore di settimana è stato deprecato, es:

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

Grazie. Hai ragione, lo stavo pensando troppo. – Rich

+0

Nessun problema. Succede :) –

+0

Siamo spiacenti ma questa risposta ha il potenziale per essere sbagliata dal momento che presuppone che ogni settimana abbia esattamente 7 giorni. La risposta di @Zaph è più sicura. – rmaddy

-1

È possibile aggiungere una categoria NSDate con il seguente metodo:

- (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

C'è stato un motivo per cui Apple ha rimosso 'settimana', non lo si aggiunge a' NSDate' in un altro modulo quando tutto ciò che serve è usare 'weekOfile' come suggeriscono i documenti. – zaph

16

Basta usare weekOfYear:

documentazione Apple per NSDateComponentsweek:

Deprecation Dichiarazione
Usa WEEKOFYEAR o weekOfMonth invece, a seconda di ciò che si intende.

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); 

uscita:

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

Se si utilizza week si riceve questo avviso:

'settimana' è deprecato: dal deprecato in ... - Utilizzare weekOfMonth o WEEKOFYEAR , a seconda di quale intendi:

Quando si utilizza il weekOfMonth o weekOfYear come delta funzionano allo stesso modo. Dove sono diversi è quando vengono utilizzati per ottenere il numero della settimana in cui si ottiene la settimana del mese con un intervallo di 6 o la settimana dell'anno con un intervallo di 53.

0

Preferisco utilizzare dateByAddingUnit. È più intuitivo

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