44 votes

NSCalendar premier jour de la semaine

Personne ne sait si il existe un moyen de définir le premier jour de la semaine sur une NSCalendar, ou est-il un calendrier qui a déjà lundi est le premier jour de la semaine, au lieu de dimanche. Je suis actuellement en train de travailler sur une application qui est basé autour d'une semaine de travail, et doit commencer le lundi et non le dimanche. Je peux probablement faire un peu de travail pour contourner ce problème, mais il y aura beaucoup de cas de coin. Je préfère la plate-forme de le faire pour moi.

Merci d'avance

Voici le code que j'utilise. c'est samedi maintenant, donc, ce que j'espère, c'est que la semaine serait de 6, au lieu de 7. cela voudrait dire que le dimanche serait de 7 au lieu de rouler à 0

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setFirstWeekday:0];
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit;
NSDateComponents *todaysDate = [gregorian components:unitFlags fromDate:[NSDate date]];
int dayOfWeek = todaysDate.weekday;

78voto

Kris Markel Points 8724

Edit: Ce ne vérifie pas le cas limite où le début de la semaine commence dans le mois précédent. Certains de code mis à jour pour couvrir ce: http://stackoverflow.com/a/14688780/308315


Dans le cas où quelqu'un est encore en accordant une attention à cela, vous devez utiliser

ordinalityOfUnit:inUnit:forDate:

et ensemble firstWeekday à 2. (1 == dimanche et 7 == samedi)

Voici le code:

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[gregorian setFirstWeekday:2]; // Sunday == 1, Saturday == 7
NSUInteger adjustedWeekdayOrdinal = [gregorian ordinalityOfUnit:NSWeekdayCalendarUnit inUnit:NSWeekCalendarUnit forDate:[NSDate date]];
NSLog(@"Adjusted weekday ordinal: %d", adjustedWeekdayOrdinal);

Rappelez-vous, les ordinaux pour les jours de la semaine commence à 1 pour le premier jour de la semaine, pas de zéro.

La Documentation de lien.

18voto

Ce code construit une date définie sur le lundi de la semaine en cours:

 NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSDate *today = [NSDate date];
NSDate *beginningOfWeek = nil;
BOOL ok = [gregorian rangeOfUnit:NSWeekCalendarUnit startDate:&beginningOfWeek
        						interval:NULL forDate: today];
 

12voto

mmc Points 12051

setFirstWeekday: sur l'objet NSCalendar. Définit l'index du premier jour de la semaine pour le récepteur.

 - (void)setFirstWeekday:(NSUInteger)weekday
 

Devrait faire l'affaire.

11voto

Amir Naor Points 1340

À mon avis, ces paramètres doivent être dynamiques en fonction des paramètres régionaux de l'utilisateur. Par conséquent, il faut utiliser:

 NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setLocale:[NSLocale currentLocale]];
 

Le calendrier sera ainsi automatiquement défini le premier jour de la semaine en fonction des paramètres régionaux de l'utilisateur. Sauf si vous développez votre application pour un objectif spécifique / des paramètres régionaux (ou préférez autoriser l'utilisateur à choisir ce jour).

7voto

iWasRobbed Points 26926

Le problème avec la réponse de Kris est le cas extrême où le début de la semaine commence le mois précédent. Voici un code plus simple et vérifie également le cas de bord:

 // Finds the date for the first day of the week
- (NSDate *)getFirstDayOfTheWeekFromDate:(NSDate *)givenDate
{
    NSCalendar *calendar = [NSCalendar currentCalendar];

    // Edge case where beginning of week starts in the prior month
    NSDateComponents *edgeCase = [[NSDateComponents alloc] init];
    [edgeCase setMonth:2];
    [edgeCase setDay:1];
    [edgeCase setYear:2013];
    NSDate *edgeCaseDate = [calendar dateFromComponents:edgeCase];

    NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:edgeCaseDate];
    [components setWeekday:1]; // 1 == Sunday, 7 == Saturday
    [components setWeek:[components week]];

    NSLog(@"Edge case date is %@ and beginning of that week is %@", edgeCaseDate , [calendar dateFromComponents:components]);

    // Find Sunday for the given date
    components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSWeekCalendarUnit|NSWeekdayCalendarUnit fromDate:givenDate];
    [components setWeekday:1]; // 1 == Sunday, 7 == Saturday
    [components setWeek:[components week]];

    NSLog(@"Original date is %@ and beginning of week is %@", givenDate , [calendar dateFromComponents:components]);

    return [calendar dateFromComponents:components];
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X