2 NSDateComponents - est-il même semaine?
-
01-10-2019 - |
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)
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 NSDate
s à 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.