【问题标题】:How to Get date from week number and year如何从周数和年份获取日期
【发布时间】:2013-07-04 00:19:48
【问题描述】:

我想从周数和年份获取日期。我从服务器获得周数和年份。我是 尝试以下代码,但它不会工作。

 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

我做错了什么?提前谢谢..

【问题讨论】:

  • 我刚刚运行它并得到了不同的答案:resultdate: 2013-01-01 00:00:00 +0000
  • 也许是setWeekOfYear:? (只是猜测)
  • 文档的这一部分也有:“在使用使用基于周的日历常量创建的日历时,使用带有日历年和工作日的 NSCalendar 会导致日期不明确。”听起来你可能正在打那个。
  • 您是否应该将NSWeekCalendarUnit 作为您的NSDateComponents 之一?

标签: ios objective-c nsdate


【解决方案1】:

您的问题是您的 NSDateComponents 对象中有不明确的组件,因为您从现有的 NSDate 创建了组件。在你的代码中放一个断点,然后查看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 日)的星期一创建日期。

当您想使用 NSDateComponents 创建 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 对象。

【讨论】:

    【解决方案2】:

    我有解决办法

      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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-17
      • 2021-12-25
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多