Обнаружение, если 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)
}
}