Peter Lapisu
Peter Lapisu

Reputation: 20985

NSDate adding a month the right way, clipping if previous month had more days

I use this method for adding month to a date

- (NSDate *)sameDateByAddingMonths:(NSInteger)addMonths {

    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSDateComponents * components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:self];
    [components setMonth:components.month + addMonths];

    return [calendar dateFromComponents:components];

}

But when the previous month in self NSDate, had more days, than it jumps on the first day next next month, like

June has 31 => self is June 31 Calling this, sets the date to 1.August, since July has 30 days

How to get this right? i thought this should behave "right" and clip on the end of month

Upvotes: 4

Views: 2453

Answers (2)

Ahmed Awad
Ahmed Awad

Reputation: 1815

You can use such a method to solve the issue, here I'm adding 18 months to a date:

+(NSDate *)addEighteenMonthsToDate:(NSDate *)startDate {

NSCalendar *calendar = [NSCalendar currentCalendar];

NSDate *newDate = [startDate copy];

newDate = [calendar dateByAddingUnit:NSCalendarUnitYear value:1 toDate:startDate options:0];

newDate = [calendar dateByAddingUnit:NSCalendarUnitMonth value:6 toDate:newDate options:0];

return newDate;  } 

Upvotes: 0

Martin R
Martin R

Reputation: 539835

That's what dateByAddingComponents is for:

- (NSDate *)sameDateByAddingMonths:(NSInteger)addMonths {

    NSCalendar *calendar = [NSCalendar currentCalendar];

    NSDateComponents *components = [[NSDateComponents alloc] init];
    [components setMonth:addMonths];

    return [calendar dateByAddingComponents:components toDate:self options:0];
}

Upvotes: 8

Related Questions