Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NSDate dateByAddingTimeInterval subtracting days incorrectly changes time

Am I missing something about how NSDate dateByAddingTimeInterval works with days? Here is my code for subtracting 33 days from a specific date (AIDate). AIDate has a time value of 00:00 PST.

activityOne.ActivityDateTime = [AIDate dateByAddingTimeInterval:-33*24*60*60];

If the AIDate equals 4-9-2013 00:00 PST, the above code will subtract 33 days and 1 hour which works out to 3-6-2013 23:00 PST.

like image 383
Aaron Avatar asked Apr 10 '13 03:04

Aaron


2 Answers

24*60*60 means 24 hours, and not 1 day. There is a huge difference between those two when your calculation crosses the change from or to daylight saving time.

Coincidentally 33 days ago there was no daylight saving time in your timezone.

The correct way to do this is to use NSDateComponents. Like this:

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *offset = [[NSDateComponents alloc] init];
[offset setDay:-33];
NSDate *offsetedDate = [calendar dateByAddingComponents:offset toDate:[NSDate date] options:0];
like image 69
Matthias Bauch Avatar answered Oct 29 '22 14:10

Matthias Bauch


 NSDateComponents *dc = [[NSCalendar currentCalendar] components:NSDayCalendarUnit|NSMonthCalendarUnit|NSYearCalendarUnit|NSHourCalendarUnit|NSMinuteCalendarUnit|NSSecondCalendarUnit|NSQuarterCalendarUnit fromDate:yourDate];
 [dc setDay:dc.day - 33];
 NSDate *noticeDate = [[NSCalendar currentCalendar] dateFromComponents:dc];
like image 6
Paras Joshi Avatar answered Oct 29 '22 15:10

Paras Joshi