5

我想找出一年中第一周的日期:

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
[components setYear:2013];
[components setMonth:1];
[components setWeekOfMonth:1];
[components setWeekday:1];
NSDate *newDate = [calendar dateFromComponents:components];
NSLog(@"%@",newDate);

我得到的是:

2012-12-29 23:00:00 +0000

当我与我的 mac 日历进行比较时,我需要得到的是:

2012-12-31 23:00:00 +0000

有什么建议么?

4

2 回答 2

4

(我意识到你现在已经弄清楚发生了什么,但为了未来的读者......)

看看你在这里做什么:

NSDateComponents *components = [[NSDateComponents alloc] init];
[components setYear:2013];
[components setMonth:1];
[components setWeekOfMonth:1];
[components setWeekday:1];

让我们以今天(2013 年 2 月 28 日)为例,看看我们在每一步之后得到了什么(假设;我无法检查这个!):

  • setYear:2013- 没有变化,因为今年已经是 2013 年了
  • setMonth:1- 更改为一月:2013-01-28
  • setWeekOfMonth:1- 在 2013 年 1 月的第一周更改为同一天(星期四):2013-01-03
  • setWeekday:1- 更改为同一周的星期日:2012-12-30

现在,当您打印出 2012 年 12 月 30 日的当地午夜时,但在 UTC 中,您会得到“2012-12-29 23:00:00 +0000”,因为您的当地时区可能比 UTC 早 1 小时。

因此,正如您已经确定的那样,您想要setDay而不是setWeekOfMonth/ setWeekday,假设您真的想要“1 月 1 日”而不是“1 月第 1 周的星期日”。

于 2013-02-28T14:00:16.470 回答
0

问题可能是设置weekDay 这里是工作代码

 NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *components = [[NSDateComponents alloc] init];
    [components setYear:2013];
    [components setMonth:1];
    [components setDay:1];

    NSDate *newDate = [calendar dateFromComponents:components];
    NSLog(@"%@",newDate); //2012-12-31 23:00:00 +0000

您可以使用的其他替代品NSGregorianCalendar,而不是currentCalender

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
        NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:[NSDate date]];
[comp setYear:2013];
[comp setMonth:1];
[comp setDay:1];
NSDate *firstDayOfMonthDate = [gregorian dateFromComponents:comp];
NSLog(@"%@",firstDayOfMonthDate);  // 2012-12-31 23:00:00 +0000
于 2013-02-28T13:41:18.463 回答