简体   繁体   English

如何从周数和年份获取日期

[英]How to Get date from week number and year

I want to get date from week number and year . 我想从周数和年份获得日期。 i got week number and year from server . 我从服务器获得周数和年份。 I am trying following code but it wont work. 我正在尝试下面的代码,但它不会工作。

 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];

Output is :- 2012-12-31 18:30:00 +0000 输出为: - 2012-12-31 18:30:00 +0000

what am i doing wrong ? 我究竟做错了什么 ? Thanks in advance.. 提前致谢..

Your problem is that you have ambiguous components in your NSDateComponents object, because you created the components from an existing NSDate. 您的问题是您的NSDateComponents对象中有不明确的组件,因为您从现有的NSDate创建了组件。 Put a breakpoint in your code and look at comps1 : 在代码中放置一个断点并查看comps1

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

It's kind of hard to create a date on monday in week 51 that is January, 1st at the same time. 在第51周的星期一创造一个日期很难,即同一时间的1月1日。

When you want to create a NSDate with NSDateComponents you should start with "fresh" components. 当您想要使用NSDateComponents创建NSDate时,您应该从“新鲜”组件开始。 Like this: 像这样:

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];

Result: 2013-12-16 (which is hopefully what you expected) 结果:2013-12-16(希望你的预期)

The code that alloc inits the components has these components: 分配组件的代码包含以下组件:

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

No ambiguity. 没有歧义。

Additionally it would be a good idea to replace [comps1 setWeek:51]; 另外,替换[comps1 setWeek:51];是个好主意[comps1 setWeek:51]; with [comps1 setWeekOfYear:51]; [comps1 setWeekOfYear:51]; But your main problem was the reuse of an existing NSDateComponents object. 但是您的主要问题是重用现有的NSDateComponents对象。

I got solution 我得到了解决方案

  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];

Output is :- 2013-04-28 18:30:00 +0000 输出为: - 2013-04-28 18:30:00 +0000

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM