cocoa在第一天获得

如何获得一个星期的第一天的date

这似乎更容易,因为:

  • 当星期一从星期日开始,我需要回到星期天的date
  • 如果星期一开始,我需要得到星期一的date

inputdate是任何一个星期的时间…我尝试了几种方法,但边缘案例使其difficould

我做了一个函数,但不能在100%(不知道[组件setDay:-weekday + 2];)

- (NSDate *)firstDateOfWeek { NSCalendar * calendar = [NSCalendar currentCalendar]; NSDateComponents *weekdayComponents = [calendar components:(NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:self]; // because sunday is 0, we need it to be 6 NSInteger weekday = (([weekdayComponents weekday] + 6) % 7); NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit) fromDate:self]; [components setDay: -weekday + 2]; return [calendar dateFromComponents:components]; } 

使用rangeOfUnit日历方法更容易,该方法根据当前的语言环境正确处理“开始”一周:

 NSDate *date = your date; NSCalendar *calendar = [NSCalendar currentCalendar]; NSDate *startOfWeek; [calendar rangeOfUnit:NSWeekOfYearCalendarUnit startDate:&startOfWeek interval:NULL forDate:date]; 

使用NSDateComponents ,它将工作如下(假定一个星期有7天):

 NSDate *date = your date; NSDateComponents *comp = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit|NSWeekdayCalendarUnit fromDate:date]; NSDate *startOfDay = [calendar dateFromComponents:comp]; NSInteger diff = (NSInteger)[calendar firstWeekday] - (NSInteger)[comp weekday]; if (diff > 0) diff -= 7; NSDateComponents *subtract = [[NSDateComponents alloc] init]; [subtract setDay:diff]; NSDate *startOfWeek = [calendar dateByAddingComponents:subtract toDate:startOfDay options:0];