2 NSDaTeComponents - это же неделя?
-
01-10-2019 - |
Вопрос
У меня есть функция с возвращающим значением Bool и 2 параметрами ввода (NSDaTeComponentents *). Моя проблема в том, что у меня есть два значения NsdaTeComponentents, и я хочу знать, если две даты падают в одной календарной неделе. Я попробовал простейшие решения для решения проблемы, моя идея была следующей:
- (BOOL)isFunctionName:(NSDateComponents *)comp1 andParam:(NSDateComponents *)comp2 {
return (([comp1 week] == [comp2 week]) && ([comp1 year] == [comp2 year]));
}
Но это не правильно. Каким образом я могу решить это?
Отредактировано
Поэтому у меня есть функция, которая делает DateComponents от дат.
-(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;
}
И я называю это таким образом:
if ([self isFunctionName: [self dateToDateComponents:startDate] and Param:[self dateToDateComponents:currentTripDate]]){
}
и во время моего теста возвращается да все мои даты (например, 2010.07.21 - 2010.08.18)
Решение
Справочные ссылки NSDaTeComponent Class:
Важный: Ан.
NSDateComponents
объект бессмысленнее в себе; Вам нужно знать, какой календарь он интерпретируется, и вам нужно знать, являются ли значения абсолютными значениями блоков или количества единиц.
Как насчет сравнения NSDate
S вместо этого?
- (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];
}
редактировать: В этой строке:
unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
Вы не проходите NSWeekCalendarUnit
, следовательно [dateComponent week]
возвращается NSUndefinedDateComponent
редактировать
Конечно, это должно быть NSWeekCalendarUnit
…
Другие советы
Это вдохновлено ответом Роберта. Я немного настроил его, чтобы решить проблему, когда неделю пересекает два года, например, 12/31/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] );
}
Начиная с iOS8, это стало намного проще:
-(BOOL)isDate:(NSDate *)date1 onSameWeekAs:(NSDate *)date2
{
return [[NSCalendar currentCalendar] isDate:date1
equalToDate:date2
toUnitGranularity:NSCalendarUnitWeekOfYear];
}
Из документация:
Возвращает да, если оба дата имеют равный компонент даты для всех устройств, превышающих или равно данному устройству, в противном случае нет.