Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to add a number of weeks to an NSDate?

I have in the past used the below function to add on a specific time interval using NSDateComponents to an existing date.

(NSDate *)dateByAddingComponents:(NSDateComponents *)comps
                          toDate:(NSDate *)date
                         options:(NSCalendarOptions)opts

From iOS8 the week value is deprecated for NSDateComponents, which means I can't achieve what I want to do: generate a new NSDate by adding a certain number of weeks to a given NSDate.

Any help would be greatly appreciated.

like image 477
Rich Avatar asked Jan 13 '15 02:01

Rich


2 Answers

Just use weekOfYear:

Apple docs for NSDateComponents week:

Deprecation Statement
Use weekOfYear or weekOfMonth instead, depending on what you intend.

NSDate *date = [NSDate date];
NSDateComponents *comp = [NSDateComponents new];
comp.weekOfYear = 3;
NSDate *date1 = [[NSCalendar currentCalendar] dateByAddingComponents:comp toDate:date options:0];
NSLog(@"date:  %@", date);
NSLog(@"date1: %@", date1);

Output:

     
date:  2015-01-13 04:06:26 +0000  
date1: 2015-02-03 04:06:26 +0000

If you use week you get this warning:

'week' is deprecated: first deprecated in ... - Use weekOfMonth or weekOfYear, depending on which you mean

When using the weekOfMonth or weekOfYear as a delta they work the same. Where they are different is when they are used to obtain the week number where you will get the week of the month with a range of 6 or the week of the year with a range of 53.

like image 51
zaph Avatar answered Sep 23 '22 01:09

zaph


Update: As Zaph said in his answer, Apple actually recommends using weekOfYear or weekOfMonth instead of the answer I provided. View Zaph's answer for details.


You'll probably quickly realize that you're overthinking it, but here's how you can add a certain number of weeks to a date even though the week value's been deprecated, ex:

NSDateComponents *comp = [NSDateComponents new];
int numberOfDaysInAWeek = 7;
int weeks = 3; // <-- this example adds 3 weeks
comp.day = weeks * numberOfDaysInAWeek;

NSDate *date = [[NSCalendar currentCalendar] dateByAddingComponents:comp toDate:date options:0];
like image 26
Lyndsey Scott Avatar answered Sep 24 '22 01:09

Lyndsey Scott