检测NSDate是否包含周末

Kob*_*ski 15 objective-c

我已将此类别添加到NSDate:

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

  if ([s isEqual:@"6"])
    return YES;
  else if ([s isEqual:@"7"])
    return YES;
  else 
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

辅助功能:

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

  return formattedDateString;
}
Run Code Online (Sandbox Code Playgroud)

isWeekend如果是星期六或星期日,应该返回YES.但如果当地的星期日有一个星期的开始,它就不起作用,在这种情况下,星期五将是第6天,星期六将是第7天.

我怎么解决这个问题?

Dav*_*ong 23

你想使用NSCalendarNSDateComponents:

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!");
}
Run Code Online (Sandbox Code Playgroud)

这是假设一周的第一天和最后一天包含"周末"(对于公历是正确的.在其他日历中可能不是这样).


ben*_*aus 15

由于iOS 8的,你可以使用isDateOnWeekend:NSCalendar.


Fed*_*llo 6

Swift 3+中:

extension Date {
  var isWeekend: Bool {
    return NSCalendar(calendarIdentifier: NSCalendar.Identifier.gregorian)!.isDateInWeekend(self)
  }
}
Run Code Online (Sandbox Code Playgroud)


mbo*_*ess 5

在Swift中:

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