NSDate dateByAddingTimeInterval restando los días incorrectamente cambia el time

¿Me estoy perdiendo algo acerca de cómo NSDate dateByAddingTimeInterval funciona con días? Aquí está mi código para restar 33 días de una date específica (AIDate). AIDate tiene un valor de time de 00:00 PST.

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

Si el AIDate es igual a 4-9-2013 00:00 PST, el código anterior restará 33 días y 1 hora, que funciona hasta el 3-6-2013 a las 23:00 PST.

24 * 60 * 60 significa 24 horas y no 1 día. Hay una gran diferencia entre esos dos cuando su cálculo cruza el cambio desde o hacia el horario de verano.

Coincidentemente hace 33 días, no hubo horario de verano en su zona horaria.

La forma correcta de hacerlo es utilizar NSDateComponents. Me gusta esto:

 NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; NSDateComponents *offset = [[NSDateComponents alloc] init]; [offset setDay:-33]; NSDate *offsetedDate = [calendar dateByAddingComponents:offset toDate:[NSDate date] options:0]; 

puedes hacerlo con el siguiente código …

  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]; 

Espero que esto te sea útil …