在上午12点dynamic创build上个星期日的date

我正在努力弄清楚如何在上午12:00之前dynamic地创build最近一个星期天的date对象

我想我可以得到今天的date,然后减去本周的当天+ 1,在这一点上,我可以减去一天的时间下降到12点。

到目前为止,我有本周的这一天:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *comps = [gregorian components:NSWeekdayCalendarUnit fromDate:[NSDate date]]; int weekday = [comps weekday]; 

在这一点上,我可以得到今天的date,并减去一天中的weekday几*秒的差异。 但是,如何在几秒钟内得到今天的时间?

无需手动计算秒(由于夏令时等原因,这是危险的)。 以下应该做你想要的:

 NSDate *today = [NSDate date]; NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; [calendar setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en-US"]]; // force US locale, because other countries (eg the rest of the world) might use different weekday numbering NSDateComponents *nowComponents = [calendar components:NSYearCalendarUnit | NSWeekCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:today]; [nowComponents setWeekday:1]; //Sunday [nowComponents setHour:0]; // 12:00 AM = midnight (12:00 PM would be 12) [nowComponents setMinute:0]; [nowComponents setSecond:0]; NSDate *previousSunday = [calendar dateFromComponents:nowComponents]; 

我会担心夏令时和你之间的转换:

 NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar]; NSDate *date = [NSDate date]; NSLog(@"date %@", date); NSDateComponents *componentsToday = [gregorian components:NSWeekdayCalendarUnit fromDate:date]; // NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSInteger days = componentsToday.weekday - 1; NSLog(@"Days=%d", days); NSDate *lastSunday = [date dateByAddingTimeInterval:-days*60*60*24]; NSLog(@"lastSunday %@", lastSunday); NSDateComponents *componentsSunday = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:lastSunday]; [componentsSunday setHour:0]; [componentsSunday setMinute:0]; [componentsSunday setSecond:0]; NSDate *targetDate = [gregorian dateFromComponents:componentsSunday]; NSLog(@"TargetDate %@", targetDate); 

@AndreasLey在Swift 2.0中的解决scheme:

  func getLastSunday() -> NSDate? { let today = NSDate(); let calendar : NSCalendar! = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian) calendar.locale = NSLocale(localeIdentifier: "en-US") // force US locale, because other countries (eg the rest of the world) might use different weekday numbering let flags : NSCalendarUnit = [.Year , .Month, .Weekday, .WeekOfMonth, .Minute , .Second] let nowComponents = calendar.components(flags, fromDate: today) nowComponents.weekday = 1 //Sunday nowComponents.hour = 0 // 12:00 AM = midnight (12:00 PM would be 12) nowComponents.minute = 0 nowComponents.second = 0; let previousSunday = calendar.dateFromComponents(nowComponents); return previousSunday } 

这段代码是在你从UIDatePickerselect的date中设定的。

  NSDate *oldDateSelected = datePicker.date; unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay; NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *comps = [calendar components:unitFlags fromDate:oldDateSelected]; comps.hour = 00; comps.minute = 00; comps.second = 44; NSDate *newDate = [calendar dateFromComponents:comps]; return newDate;