2 NSDateComponents - это та же неделя? - PullRequest
0 голосов
/ 25 августа 2010

У меня есть функция с возвращаемым значением BOOL и 2 входными (NSDateComponents *) параметрами. Моя проблема в том, что у меня есть два значения NSDateComponents, и я хочу знать, попадают ли две даты в одну и ту же календарную неделю. я пробовал самые простые решения для решения проблемы, моя идея заключалась в следующем:

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

но это не правильно. каким образом я могу решить это?


изм

, так что у меня есть функция, которая делает компоненты даты из дат.

-(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)

Ответы [ 3 ]

2 голосов
/ 08 января 2013

Это вдохновлено ответом Роберта.Я немного подправил его для решения проблемы, когда неделя пересекает два года, например, 31.12.2012 и 01.01.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] );
}
1 голос
/ 25 августа 2010

Ссылка на класс NSDateComponent гласит:

Важно: Объект 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];
}

edit : В этой строке:

 unsigned unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;

Вы не передаете NSWeekCalendarUnit, поэтому [dateComponent week] возвращает NSUndefinedDateComponent

edit

Конечно, это должно быть NSWeekCalendarUnit

0 голосов
/ 12 февраля 2016

Начиная с iOS8, это стало намного проще:

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

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

возвращает YES, если обе даты имеют одинаковый компонент даты длявсе единицы больше или равны данной единице, в противном случае НЕТ.

...