为什么这不会增加几周?

时间:2014-06-19 14:09:56

标签: objective-c nsdate nsdatecomponents

我有这个NSDate类别可以轻松添加或减去日期。几天,几个月和几年都很好,但是几周都没有用。我错过了什么?

- (NSDate *)addDays:(int)days
              weeks:(int)weeks
             months:(int)months
              years:(int)years {
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *comps = [calendar components:NSYearCalendarUnit | NSMonthCalendarUnit |  NSWeekCalendarUnit | NSDayCalendarUnit  fromDate:self];

    if (days) {
        [comps setDay:[comps day] + days];
    }

    if (weeks) {
        [comps setWeek:[comps week] + weeks];
    }

    if (months) {
        [comps setMonth:[comps month] + months];
    }

    if (years) {
        [comps setYear:[comps year] + years];
    }

    NSDate *nextDate = [calendar dateFromComponents:comps];

    return nextDate;
}

致电:

NSDate *showDate = [NSDate date];        
showDate = [showDate addDays:0 weeks:1 months:0 years:0];

对于指定日期:2014-06-19 14:00:11 +0000,我预计2014-06-26 04:00:00 +0000的输出。它保持不变。

1 个答案:

答案 0 :(得分:0)

来自-[NSCalendar dateFromComponents:]文档:

  

当信息不一致时,日历可能会忽略某些组件参数,或者该方法可能返回nil。忽略不必要的组件(例如,Day优先于Weekday和Weekday序数)。

即使您只添加了几周,仍然会为day实例设置NSDateComponents。您将在dayweek之间发生冲突,week将被忽略。

例如,今天是:

19 Jun 2014, Week 25

如果我将10添加到周

19 Jun 2014, Week 35

然后19 Jun显然与Week 35发生碰撞。

要解决此问题,请创建一个新的NSDateComponents实例:

NSDateComponents *comps = [[NSDateComponents alloc] init];

[comps setDay:days];
[comps setWeek:weeks];
[comps setMonth:months];
[comps setYear:years];

并使用

NSDate *nextDate = [calendar dateByAddingComponents:comps
                                             toDate:self
                                            options:0];