Вопрос

У меня есть функция с возвращающим значением 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 объект бессмысленнее в себе; Вам нужно знать, какой календарь он интерпретируется, и вам нужно знать, являются ли значения абсолютными значениями блоков или количества единиц.

Как насчет сравнения NSDateS вместо этого?

- (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];
}

Из документация:

Возвращает да, если оба дата имеют равный компонент даты для всех устройств, превышающих или равно данному устройству, в противном случае нет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top