2013-06-01 12 views
5

Ho bisogno di calcolare il giorno della settimana per una certa data, tuttavia, a seconda del calendario di una settimana può stella il Lunedi e somwhere la DomenicaNSCalendar, perché l'impostazione del primo giorno della settimana non influisce sul risultato del calcolo?

così ho voluto impostarla, per iniziare il Lunedi, utilizzando

[[NSCalendar currentCalendar] setFirstWeekday:2]; 

tuttavia, il risultato di calcolo è lo stesso

{ 
    [[NSCalendar currentCalendar] setFirstWeekday:1]; 
    NSDateComponents *weekdayComponents = [[NSCalendar currentCalendar] components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:date]; 
    NSInteger weekday = [weekdayComponents weekday] - 1; 
    NSLog(@"%d", weekday); 
} 
{ 
    [[NSCalendar currentCalendar] setFirstWeekday:2]; 
    NSDateComponents *weekdayComponents = [[NSCalendar currentCalendar] components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:date]; 
    NSInteger weekday = [weekdayComponents weekday] - 1; 
    NSLog(@"%d", weekday); 
} 

rendimenti stessi numeri, ma perché?

risposta

8

Il comportamento visualizzato è corretto. Il componente del giorno della settimana non è interessato dalla proprietà firstWeekday. Se hai una data che rappresenta una domenica, sarà sempre domenica se inizi la settimana in quella domenica o lunedì. Ciò che dovrebbe influenzare è il numero della settimana nella proprietà della settimana dei componenti della data.

+0

così domenica sarà sempre giorno della settimana 0, non importa quali siano i primi punti del giorno feriale? –

+5

Domenica è sempre 1 – Sven

+3

Domenica 1, lunedì 2, martedì 3, mercoledì 4, venerdì 5, sabato 6 –

3

Credo che sia necessario utilizzare il metodo ordinalityOfUnit:inUnit:forDate: anziché tentare di estrarre i componenti della data. Quindi, qualcosa di simile:

NSUInteger weekday = [[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:date]; 

Fondamentalmente la chiamata sta chiedendo per il giorno (NSWeekdayCalendarUnit) nella settimana (NSWeekCalendarUnit) per la data indicata.

Se ciò non funziona come è, potrebbe essere necessario creare il proprio calendario, piuttosto che provare a modificare il primo giorno della settimana su currentCalendar.

Ad esempio:

NSCalendarIdentifier calendarIdentifier = [[NSCalendar currentCalendar] calendarIdentifier]; 
NSCalendar *calendar = [[[NSCalendar alloc] initWithCalendarIdentifier:calendarIdentifier] autorelease]; 
[calendar setFirstWeekday:2]; 

quindi utilizzare tale nuova calendar oggetto piuttosto che [NSCalendar currentCalendar] nella chiamata ordinalityOfUnit:inUnit:forDate:.

+0

NSWeekCalendarUnit è deprecato:/ –

+0

Forse provare una delle altre unità della settimana: "NSWeekOfMonthCalendarUnit' o" NSWeekOfYearCalendarUnit'. Non hanno davvero senso in questo contesto, ma vale la pena provare. –

+1

Su iOS 10 setFirstWeekday: 2 non cambia nulla ... – Dmitry

Problemi correlati