如何检查NSDate是否在本周?

如何检查NSDate属于当年的当前周? 我在下面试过,但上周的日期也在"Date is in this week"情况下。

 - (NSInteger)thisW:(NSDate *)date { NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *todaysComponents = [gregorian components:NSWeekCalendarUnit fromDate:[NSDate date]]; NSUInteger todaysWeek = [todaysComponents weekday]; NSDateComponents *otherComponents = [gregorian components:NSWeekCalendarUnit fromDate:date]; NSUInteger datesWeek = [otherComponents weekday]; NSLog(@"Date %@",date); if(todaysWeek==datesWeek){ //NSLog(@"Date is in this week"); return 1; }else if(todaysWeek+1==datesWeek){ //NSLog(@"Date is in next week"); return 2; } else { return 0; } } 

我不得不用NSCalendarUnitWeekOfYear替换NSCalendarUnitWeekOfYear

 - (NSInteger)thisW:(NSDate *)date { NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *todaysComponents = [gregorian components:NSCalendarUnitWeekOfYear fromDate:[NSDate date]]; NSUInteger todaysWeek = [todaysComponents weekOfYear]; NSDateComponents *otherComponents = [gregorian components:NSCalendarUnitWeekOfYear fromDate:date]; NSUInteger datesWeek = [otherComponents weekOfYear]; //NSLog(@"Date %@",date); if(todaysWeek==datesWeek){ //NSLog(@"Date is in this week"); return 1; }else if(todaysWeek+1==datesWeek){ //NSLog(@"Date is in next week"); return 2; } else { return 0; } } 

使用此function获取周数:

 - (NSInteger)numberOfWeek:(NSDate *)date { NSCalendar *calender = [NSCalendar currentCalendar]; NSDateComponents *components = [calender components:NSCalendarUnitWeekOfYear fromDate:date]; return [components weekOfYear]; } 

使用此代码,您可以像这样比较周。 我只是使用dateWithTimeIntervalSinceNow:使用下周的日期dateWithTimeIntervalSinceNow:仅用于比较。

 if ([self numberOfWeek:[NSDate date]] == [self numberOfWeek:[NSDate dateWithTimeIntervalSinceNow: (60.0f*60.0f*24.0f*7.0f)]]) { NSLog(@"Same Week"); } else { NSLog(@"Different Week"); } 

使用方法rangeOfUnit:startDate:interval:forDate of NSCalendar的解决方案来计算开始日期和当前周的间隔

 - (BOOL)isInCurrentWeek:(NSDate *)date { NSDate *startDate = nil; NSTimeInterval interval = 0.0; NSCalendar *calendar = [NSCalendar currentCalendar]; // calendar.firstWeekday = 1; set the index of the first weekday if necessary [calendar rangeOfUnit:NSWeekOfYearCalendarUnit startDate: &startDate interval: &interval forDate: [NSDate date]]; NSDate *endDate = [calendar dateByAddingUnit:NSSecondCalendarUnit value: (NSInteger)interval toDate: startDate options:NSCalendarMatchNextTime]; return [date compare:startDate] == NSOrderedDescending && [date compare:endDate] == NSOrderedAscending; } 

或者在斯威夫特

 func isInCurrentWeek(date : NSDate) -> Bool { var startDate : NSDate? var interval : NSTimeInterval = 0.0 let calendar = NSCalendar.currentCalendar() // calendar.firstWeekday = 1 set the index of the first weekday if necessary calendar.rangeOfUnit(.WeekOfYear, startDate: &startDate , interval: &interval, forDate: NSDate()) let endDate = calendar.dateByAddingUnit(.Second, value: Int(interval), toDate: startDate!, options: .MatchNextTime)! return date.compare(startDate!) == .OrderedDescending && date.compare(endDate) == .OrderedAscending } 

首先得到当前日期的第一天和最后一天。

 NSCalendar *myCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *currentComps = [myCalendar components:( NSYearCalendarUnit | NSMonthCalendarUnit | NSWeekOfYearCalendarUnit | NSWeekdayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit) fromDate:[NSDate date]]; [currentComps setWeekday:1]; // 1: sunday NSDate *firstDayOfTheWeek = [myCalendar dateFromComponents:currentComps]; [currentComps setWeekday:7]; // 7: saturday NSDate *lastDayOfTheWeek = [myCalendar dateFromComponents:currentComps]; 

现在使用给出感兴趣日期的方法

 BOOL isInCurrentWeek = [self date:your given date isBetweenDate:firstDayOfTheWeek andDate:lastDayOfTheWeek]; NSLog(@"%d",isInCurrentWeek); 

期待的方法

 - (BOOL)date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate { if ([date compare:beginDate] == NSOrderedAscending) return NO; if ([date compare:endDate] == NSOrderedDescending) return NO; return YES; } 

在Swift 4中这个短暂的扩展怎么样?

 extension Calendar { func isDayInCurrentWeek(date: Date) -> Bool? { let currentComponents = Calendar.current.dateComponents([.weekOfYear], from: Date()) let dateComponents = Calendar.current.dateComponents([.weekOfYear], from: date) guard let currentWeekOfYear = currentComponents.weekOfYear, let dateWeekOfYear = dateComponents.weekOfYear else { return nil } return currentWeekOfYear == dateWeekOfYear } }