2013-08-09 11 views
5

Desidero ottenere la data del prossimo lunedì successivo alla data corrente.Trova l'NSDate per il prossimo lunedì

Quindi se la data odierna è il 2013-08-09 (venerdì), desidero ottenere la data 2013-08-12.

Come posso fare questo?

+5

Anche se questo è una domanda semplice e richiede poco sforzo, le date sono fastidiose come l'inferno in qualsiasi lingua, quindi non vedo perché dovresti essere sottovalutato. –

risposta

30

Questo pezzo di codice dovrebbe ottenere quello che vuoi. Calcola semplicemente quanti giorni sono da lunedì e lo aggiungono dalla data corrente.

NSDate *now = [NSDate date]; 
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit fromDate:now]; 

NSUInteger weekdayToday = [components weekday]; 
NSInteger daysToMonday = (9 - weekdayToday) % 7; 

NSDate *nextMonday = [now dateByAddingTimeInterval:60*60*24*daysToMonday]; 

testato, ma dovrebbe funzionare, e senza preoccuparsi di cambiare le date del primo calendario.

E può anche essere facilmente addapted ad ogni altro giorno della settimana, basta cambiare il 9 all'interno (9 - weekdayToday) % 7; da 7 + weekDayYouWant, ricordando che domenica = 1, lunedi = 2 ...

+0

Grazie Lucas, funziona perfettamente. Solo una cosa, se oggi è lunedì, voglio mostrare il lunedì successivo invece di questo lunedì. Puoi dirmi come posso ottenere questo? Grazie ancora – iOSAppDev

+0

Non penso che ci sia un modo elegante per cambiare il comportamento per un solo giorno del genere. Ma puoi ** aggiungere ** (non sostituire) qualcosa del genere, ** prima ** il codice '' 'nextMonday'':' '' daysToMonday = (daysToMonday == 0)? 7: daysToMonday; '' '. In questo modo, aggiungerei 7 giorni invece di 0 giorni quando il giorno corrente è lunedì. Se trovi una soluzione migliore per questo caso, fammelo sapere –

+1

Grazie per la risposta rapida e la tua soluzione ha funzionato perfettamente :) Grazie – iOSAppDev

5

È possibile utilizzare il metodo NSCalendardateFromComponents: passando un correttamente avviato NSDateComponents oggetto

NSDateComponents *components = [[NSCalendar currentCalendar] components: NSYearCalendarUnit | NSWeekOfYearCalendarUnit fromDate:[NSDate date]]; 

NSDateComponents *comps = [[NSDateComponents alloc] init]; 
[comps setWeekOfYear:[components weekOfYear] + 1]; 
[comps setWeekday:1]; 
[comps setYear:[components year]]; 
NSCalendar *calendar = [NSCalendar currentCalendar]; 
[calendar setFirstWeekday:2]; //This needs to be checked, which day is monday? 
NSDate *date = [calendar dateFromComponents:comps]; 

Qualcosa in questo senso potrebbe funzionare (ciecamente digitato)

+0

supponendo che la settimana inizi di domenica (giorno della settimana = 0), questo codice non otterrebbe il lunedì della settimana dopo invece del solo giorno successivo quando è in funzione la domenica? –

+3

Le unità giorno della settimana sono i numeri da 1 a n, dove n è il numero di giorni della settimana. Ad esempio, nel calendario gregoriano, n è 7 e la domenica è rappresentata da 1. Quindi sì, probabilmente il codice deve essere modificato – Vik

+1

Ho leggermente modificato il codice per tenerne conto. Ovviamente si dovrebbe anche verificare che il giorno corrente non sia l'ultima settimana dell'anno e così via .. – Vik

Problemi correlati