2017-02-15 4 views
0

Je voudrais vérifier si un NSDate est dans la même semaine qu'aujourd'hui. Par conséquent, je considère le weekOfYear s à partir d'un NSDateComponents comme mentionné dans ce post.Vérifier si un NSDate est dans la semaine en cours en utilisant la semaine de l'année

- (BOOL)dateIsThisWeek:(NSDate *)date 
{ 
    NSCalendar *cal = [NSCalendar currentCalendar]; 
    [cal setFirstWeekday: 2]; // Added in second try 

    NSDate *today = [NSDate date]; 
    NSDateComponents *todaysComponents = [cal components:NSCalendarUnitWeekOfYear fromDate: today]; 
    NSUInteger todaysWeek = [todaysComponents weekOfYear]; 

    NSDateComponents *otherComponents = [cal components:NSCalendarUnitWeekOfYear fromDate: date]; 
    NSUInteger anotherWeek = [otherComponents weekOfYear]; 

    return todaysWeek == anotherWeek; // todaysWeek=7 | anotherWeek=8 
} 

Dans mon exemple, j'ai les dates suivantes:

today: 2017-02-15 12:00:00 +0000 
date: 2017-02-18 12:00:00 +0000 

Le problème est que todaysWeek est fixé à 7 et anotherWeek-8 et je ne peux pas imaginer pourquoi.

Je pensais que le problème pourrait être, que la semaine commence un dimanche, donc j'ai mis le premier jour de la semaine du calendrier à 2 (lundi), mais malheureusement sans aucun succès.

MISE À JOUR

J'ai aussi essayé ce code, mais malheureusement, avec le même résultat:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
NSDateComponents *todaysComponents = [gregorian components:NSCalendarUnitWeekOfYear fromDate:[NSDate date]]; 
NSUInteger todaysWeek = [todaysComponents weekOfYear]; 
NSDateComponents *otherComponents = [gregorian components:NSCalendarUnitWeekOfYear fromDate: date]; 
NSUInteger datesWeek = [otherComponents weekOfYear]; 

return todaysWeek==datesWeek; // todaysWeek=7 | datesWeek=8 

Les deux dates devraient être en nombre de semaines 7 comme plusieurs websites sont décris.

+1

Comment définissez-vous une "semaine"? Est-ce la «semaine nommée» actuelle, c'est-à-dire à partir de dimanche dernier? À partir de lundi dernier? Est-ce une semaine 7 jours consécutifs? Donc, si le 1er janvier est un jeudi, alors le mardi 6 janvier est toujours la première "semaine"? – DonMag

+0

Copie possible de [Comment vérifier si NSDate est dans la semaine en cours?] (Http://stackoverflow.com/questions/38970836/how-to-check-if-nsdate-is-in-current-week) –

+0

@DonMag à mon avis, une semaine est du lundi au dimanche comme dans cet exemple: http://week-number.net/calendar-with-week-numbers-2017.html – user3191334

Répondre

1

Essayez ceci peut-être? (Copié à partir de mon propre code de projet)

NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 
[gregorianCalendar setLocale:[NSLocale localeWithLocaleIdentifier:@"be_NL"]]; 

NSDateComponents *comps = [[NSDateComponents alloc] init]; 
[comps setDay:19]; 
[comps setMonth:02]; 
[comps setYear:2017]; 
NSDate *date = [gregorianCalendar dateFromComponents:comps]; 

//NSCalendar *cal = [NSCalendar currentCalendar]; 
//[gregorianCalendar setFirstWeekday:2]; // Added in second try 

NSDate *today = [NSDate date]; 
NSDateComponents *todaysComponents = [gregorianCalendar components:NSCalendarUnitWeekOfYear fromDate: today]; 
//[todaysComponents setWeekdayOrdinal:2]; 

NSDateComponents *otherComponents = [gregorianCalendar components:NSCalendarUnitWeekOfYear fromDate: date]; 
//[otherComponents setWeekdayOrdinal:2]; 

// Not sure if needed to set timezone too depending on your local time, but you can set this for all dates if needed 
//[otherComponents setTimeZone:[NSTimeZone localTimeZone]]; 

NSUInteger todaysWeek = [todaysComponents weekOfYear]; 
NSUInteger anotherWeek = [otherComponents weekOfYear]; 

NSLog(@"todays week %ld",(long)todaysWeek); 
NSLog(@"anotherWeek %ld",(long)anotherWeek); 

Imprime:

2017-02-17 03:51:58.231797 Sneak[5518:2676264] todays week 7 
2017-02-17 03:51:58.231836 Sneak[5518:2676264] anotherWeek 7 

EDIT: (Comme il est indiqué ci-dessous dans la section commentaire)

lundi est le premier jour de la semaine selon à la norme internationale ISO 8601, mais aux États-Unis, au Canada et au Japon, il s'agit du deuxième jour de la semaine. Lundi vient après dimanche et avant mardi dans notre calendrier grégorien moderne. - timeanddate.com/calendar/days/monday.html espoir "be_NL" ne passe - DonMag

+0

Merci et désolé. Je viens de copier votre code et ça marche maintenant. Je ne peux pas imaginer la raison pour laquelle j'ai toujours eu la semaine 8. EDIT: La première solution était suffisante mais la seconde marche bien aussi. MERCI :) – user3191334

+0

@ user3191334 NP, vous pouvez l'utiliser. Ne pas oublier d'accepter ma réponse pour la communauté :) –

+1

Êtes-vous les gars * sûr * que cela fait ce que vous voulez? Si je comprends bien, @ user3191334 veut que le dimanche 19 février soit dans la même semaine qu'aujourd'hui, mercredi 15 février. Avec le code ci-dessus, vous fixez la date de comparaison au samedi 18 et vous obtenez les semaines 7 et 7. .. Si vous le lancez avec '[comps setDay: 19]' vous obtenez les semaines 7 et 8. Ou? – DonMag

0

Ceci est une très légère modification au code de Sneak ... Appelez avec:

// 
// startDayOfWeek: Sunday == 1, Monday == 2, Tues == 3, etc 

Bool b = [self dateIsThisWeek:date startDayOfWeek:2]; 


- (BOOL)dateIsThisWeek:(NSDate *)dateToTest startDayOfWeek:(NSInteger)iStart { 

    NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; 

    // this is the key - 1 == week runs Sunday-Saturday, 2 == Monday-Sunday, 3 == Tues-Mon, etc 
    [gregorianCalendar setFirstWeekday:iStart]; 

    NSDate *today = [NSDate date]; 

    NSDateComponents *todaysComponents = [gregorianCalendar components:NSCalendarUnitWeekOfYear|NSCalendarUnitWeekday fromDate: today]; 
    NSInteger todaysWeek = [todaysComponents weekOfYear]; 

    NSDateComponents *testComponents = [gregorianCalendar components:NSCalendarUnitWeekOfYear|NSCalendarUnitWeekday fromDate: dateToTest]; 
    NSInteger testsWeek = [testComponents weekOfYear]; 

    return todaysWeek == testsWeek; 
}