Question

i ont obtenu une fonction avec BOOL valeur de retour et deux entrées (NSDateComponents *) paramètres. Mon problème est que j'ai deux valeurs NSDateComponents et je veux savoir si les deux date d'automne dans la même semaine civile. J'ai essayé les solutions les plus simples à résoudre le problème, mon idée était la suivante:

- (BOOL)isFunctionName:(NSDateComponents *)comp1 andParam:(NSDateComponents *)comp2 { return (([comp1 week] == [comp2 week]) && ([comp1 year] == [comp2 year])); }

mais ce n'est pas correct. de quelle façon je peux le résoudre?


édité

donc j'ai une fonction qui fait datecomponents de dates.

-(NSDateComponents *)dateToDateComponents:(NSDate *)date { unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *dateComponents = [gregorian components:unitFlags fromDate:date]; [gregorian release]; return dateComponents; }

et je l'appelle ainsi:

if ([self isFunctionName: [self dateToDateComponents:startDate] and Param:[self dateToDateComponents:currentTripDate]]){ }

et lors de mon test, il retourne OUI toutes mes dates (par exemple 2010.07.21 - 2010.08.18)

Était-ce utile?

La solution

Les états de référence de classe NSDateComponent:

  

Important: Un objet NSDateComponents est sans signification en soi; vous   besoin de savoir ce que le calendrier est   contre interprétez, et vous devez   savoir si les valeurs sont absolues   valeurs des unités ou des quantités de   les unités.

Qu'en est-il comparant NSDates à la place?

- (BOOL) weekIsEqual:(NSDate *)date and:(NSDate *)otherDate {
  NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];

  NSDateComponents *dateComponents      = [gregorian components:NSWeekdayCalendarUnit | NSYearCalendarUnit fromDate:date];
  NSDateComponents *otherDateComponents = [gregorian components:NSWeekdayCalendarUnit | NSYearCalendarUnit fromDate:otherDate];

  return [dateComponents week] == [otherDateComponents week] && [dateComponents year] == [otherDateComponents year];
}

modifier : Dans cette ligne:

 unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;

Vous ne passez pas NSWeekCalendarUnit, retours donc [dateComponent week] NSUndefinedDateComponent

modifier

Bien sûr, il doit être NSWeekCalendarUnit ...

Autres conseils

Ceci est inspiré par la réponse de Robert. Je peaufiné un peu pour résoudre le problème lorsqu'une semaine traverse deux ans, par exemple 31/12/2012 & 1/1/2013.

- (BOOL)isOnSameWeekAsDate:(NSDate*)otherDate
{
    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
    unsigned unitFlags = NSCalendarUnitYearForWeekOfYear | NSCalendarUnitWeekOfYear;

    NSDateComponents *components = [calendar components:unitFlags fromDate:self];
    NSDateComponents *otherComponents = [calendar components:unitFlags fromDate:otherDate];

    return ( [components yearForWeekOfYear] == [otherComponents yearForWeekOfYear] && [components weekOfYear] == [otherComponents weekOfYear] );
}

A partir de iOS8, cela est devenu beaucoup plus facile:

-(BOOL)isDate:(NSDate *)date1 onSameWeekAs:(NSDate *)date2
{
    return [[NSCalendar currentCalendar] isDate:date1
                                    equalToDate:date2
                              toUnitGranularity:NSCalendarUnitWeekOfYear];
}

De documentation :

  

renvoie OUI si les deux dates ont composante de date égale pour toutes les unités   supérieur ou égal à l'unité donnée, sinon NO.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top