Objective c 检测NSDate是否包含周末

Objective c 检测NSDate是否包含周末,objective-c,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; } 辅助功能: - (NSString*)asString:(NSString*)format { NSDateFormatt

我已将此类别添加到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天


如何解决此问题?

您想使用
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!");
}

这是在假设一周的第一天和最后一天包括“周末”的情况下运行的(这在公历中是正确的。在其他日历中可能不正确)。

从iOS 8开始,您可以在Swift中使用
isDateOnWeekend:
on
NSCalendar

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

Swift 3+中:

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

假设“asString:”使用指定的日期格式创建一个NSDateFormatter,然后通过它运行NSDate,这样安全吗?我没想到这个解决方案会起作用。但确实如此。:-)适用于周日开始一周的地区,以及周一开始的地区。我必须承认我不明白maximumRangeOfUnit:。@Kobski的
maximumRangeOfUnit:
基本上是指一周有多少天。@dave delong感谢您花时间澄清这一点,但这不总是7天吗?我添加了一些调试代码只是为了查看值,对于我尝试过的区域设置,位置为1,长度为7。但为什么周末的工作日应该是1或7呢?@Kobski在大多数现代日历中,是的,它总是7。但是,没有规则规定您不能创建一周有42天的日历(其他日历也可能存在一周没有7天的日历)。“1或7”检查实际上是检查“这一天是在一周的第一天还是最后一天”,而不管一周有多少天。但实际上很少有软件处理这些日历,所以最好只说“7”,而不要让其他人在以后阅读你的代码时不得不找出额外的内容。当你没有实际问题要解决时,越简单越好。@Yohst-ha,是的!斯威夫特可以非常简洁:)应该是在周末