Обнаружение, если NSDate содержит выходной день

У меня есть эта категория, добавленная в NSDate:

- (bool)isWeekend
{
  NSString* s = [self asString:@"e"];

  if ([s isEqual:@"6"])
    return YES;
  else if ([s isEqual:@"7"])
    return YES;
  else 
    return NO;
}

Вспомогательная функция:

- (NSString*)asString:(NSString*)format
{
  NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
  [dateFormatter setDateFormat:format];
  NSString *formattedDateString = [dateFormatter stringFromDate:self];
  [dateFormatter release];

  return formattedDateString;
}

isWeekend должен вернуть YES, если это суббота или воскресенье. Но это не сработает, если в локале начнется неделя в воскресенье, и в этом случае пятница будет днем ​​6, а суббота будет днем ​​7.

Как я могу это решить?

Ответы

Ответ 1

Вы хотите использовать NSCalendar и NSDateComponents:

NSDate *aDate = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSRange weekdayRange = [calendar maximumRangeOfUnit:NSWeekdayCalendarUnit];
NSDateComponents *components = [calendar components:NSWeekdayCalendarUnit fromDate:aDate];
NSUInteger weekdayOfDate = [components weekday];

if (weekdayOfDate == weekdayRange.location || weekdayOfDate == weekdayRange.length) {
  //the date falls somewhere on the first or last days of the week
  NSLog(@"weekend!");
}

Это работает в предположении, что первый и последний дни недели состоят из "концов недели" (что верно для григорианского календаря. Это может быть неверно в других календарях).

Ответ 2

Как и в iOS 8, вы можете использовать isDateOnWeekend: на NSCalendar.

Ответ 3

В Swift:

func isWeekend(date: NSDate) -> Bool {
    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)!
    return calendar.isDateInWeekend(date)
}

Ответ 4

В Swift 3 +:

extension Date {
  var isWeekend: Bool {
    return NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)!.isDateInWeekend(self)
  }
}