如何从周数和年份获取date

我想从周数和年份得到date。 我从服务器得到了一周数字和一年。 我正在尝试下面的代码,但它不会工作。

NSDateFormatter *dateFormatter2 = [[NSDateFormatter alloc] init]; // this is imporant - we set our input date format to match our input string // if format doesn't match you'll get nil from your string, so be careful [dateFormatter2 setDateFormat:@"yyyy-MM-dd"]; NSDate *now = [dateFormatter2 dateFromString:@"2001-01-01"]; NSCalendar *gregorian1 = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *comps1 = [gregorian1 components:NSWeekdayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:now]; [comps1 setYear:2013]; [comps1 setWeek:51]; [comps1 setWeekday:2]; NSDate *resultDate = [gregorian1 dateFromComponents:comps1]; 

产量是: – 2012-12-31 18:30:00 +0000

我究竟做错了什么 ? 提前致谢..

你的问题是你的NSDateComponents对象中有不明确的组件,因为你从现有的NSDate创build了组件。 在你的代码中放一个断点,看看comps1

 (lldb) po comps1 $0 = 0x0ab354f0 <NSDateComponents: 0xab354f0> Calendar Year: 2013 Month: 1 Leap month: no Day: 1 Week (obsolescent): 51 Weekday: 2 

第51周的星期一是1月1日,同一时间创build一个date是很难的。

当你想用NSDateComponents创build一个NSDate时,你应该从“新鲜”组件开始。 喜欢这个:

 NSCalendar *gregorian1 = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *comps1 = [[NSDateComponents alloc] init]; [comps1 setYear:2013]; [comps1 setWeek:51]; [comps1 setWeekday:2]; NSDate *resultDate = [gregorian1 dateFromComponents:comps1]; 

结果:2013-12-16(这是希望你所期望的)

分配到组件中的代码有这些组件:

 (lldb) po comps1 $0 = 0x0a37d220 <NSDateComponents: 0xa37d220> Calendar Year: 2013 Leap month: no Week (obsolescent): 51 Weekday: 2 

没有歧义。

此外,这将是一个好主意,以取代[comps1 setWeek:51]; [comps1 setWeekOfYear:51]; 但是你的主要问题是重用一个现有的NSDateComponents对象。

我有解决scheme

  NSDateFormatter *dateFormatter2 = [[NSDateFormatter alloc] init]; // this is imporant - we set our input date format to match our input string // if format doesn't match you'll get nil from your string, so be careful [dateFormatter2 setDateFormat:@"yyyy-MM-dd"]; NSDate *now = [dateFormatter2 dateFromString:@"2001-01-01"]; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; gregorian.firstWeekday = 2; // Sunday = 1, Saturday = 7 NSDateComponents *components = [gregorian components:NSYearCalendarUnit |NSWeekdayCalendarUnit fromDate:now]; [components setYear:2013]; [components setWeekOfYear:18]; [components setWeekday:2]; NSDate *resultDate = [gregorian dateFromComponents:components]; 

输出是: – 2013-04-28 18:30:00 +0000