Objective-C / iOS:获取某一周的特定date(星期日)

我需要在当周得到某一天(星期天)的date。 我使用这个date来确定是否应该发生每周重置,并且我在最近的重置date前做了一些计算是在星期date之前等。这主要是问了很多次,而且我的解决scheme已经在过去6个月工作了。 但今天,2013年12月29日,它停止工作。

目前使用的function:

+ (NSDate *) getSundaysDate{ NSDate *currentDate = [NSDate date]; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; [gregorian setFirstWeekday:1]; NSDateComponents *components = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSWeekCalendarUnit) fromDate:currentDate]; NSDateComponents *dt = [[NSDateComponents alloc]init]; [dt setWeek:[components week]]; [dt setWeekday:1]; [dt setMonth:[components month]]; [dt setYear:[components year]]; return [gregorian dateFromComponents:dt]; } 

这曾经像一个魅力工作,但今天,在我的应用程序,这将返回:

 NSLog(@"sundaysDate %@", [Util getSundaysDate]); sundaysDate 2012-12-29 23:00:00 +0000 NSLog(@"Current date %@", [[NSDate date] debugDescription]); Current date 2013-12-29 11:37:23 +0000 

注意2012年。

我知道这已经有好几次了,在不同的情况下,所以我提前道歉,但是我根本没有得到2012年。

编辑 – 只是为了阐明所需的function:

每周从星期天开始(第1天)

星期六(第7天)结束

鉴于目前的date,我需要一周的第一天的date。

 Example 1: today is 29th December 2013 Expected: Sunday is 29th December 2013 Example 2: today is 4th January 2014 Expected: Sunday was 29th December 2013 Example 2: today is 8th January 2014 Expected: Sunday was 5th January 2014 

我想你需要使用WeekOfMonth而不是Week
NSWeekCalendarUnit基本上是一年中的一周,因此指定它和月份是冲突的。

请注意, NSWeekCalendarUnit已过时:

弃用声明
取而代之的是使用weekOfYearweekOfMonth ,具体取决于你的意图。

 NSDate *currentDate = [NSDate date]; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; [gregorian setFirstWeekday:1]; NSDateComponents *components = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSWeekdayCalendarUnit | NSWeekOfMonthCalendarUnit) fromDate:currentDate]; [components setWeekday:1]; NSDate *sundatsData = [gregorian dateFromComponents: components]; NSLog(@"sundaysDate: %@", sundatsData); 

NSLog输出:

sundaysDate:2013-12-29 05:00:00 +0000