2013-04-10 6 views
5

Mi manca qualcosa su come NSDate dateByAddingTimeInterval funziona con giorni? Ecco il mio codice per sottrarre 33 giorni da una data specifica (AIDate). AIDate ha un valore orario di 00:00 PST.DataSData dataByAddingTimeInterval giorni di sottrazione in modo non corretto cambia ora

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

Se l'AIDate uguale 2013/04/09 00:00 PST, il codice di cui sopra sarà sottrarre 33 giorni e 1 ora che funziona a 2013/03/06 23:00 PST.

+2

Il tuo problema è probabilmente l'ora legale. Mai e poi mai usare 24 * 60 * 60 per esprimere "1 giorno". –

+0

@MatthiasBauch sì, giusto per questo requisito NSDateComponents è meglio ... –

+0

@MatthiasBauch Ah - questo ha un significato totale - grazie per la pubblicazione! – Aaron

risposta

11

24 * 60 * 60 significa 24 ore, e non 1 giorno. C'è un'enorme differenza tra questi due quando il tuo calcolo incrocia il cambio da o all'ora legale.

Per coincidenza 33 giorni fa non c'era l'ora legale nel proprio fuso orario.

Il modo corretto per eseguire questa operazione è utilizzare NSDateComponents. In questo modo:

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

si può fare con il codice di soffietto ..

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

Spero che questo sia utile a voi ...

+0

Funziona correttamente - grazie per averlo pubblicato. Qualche idea sul perché il mio codice lo sottragga in modo errato? – Aaron

+0

@Aaron per i tuoi requisiti, se possibile, quindi usa NSDateComponents che ti dà l'output perfetto .. è meglio per te .. qui puoi anche usare questo tipo di flusso NSDate * newDate1 = [ora addTimeInterval: 60 * 60 * 24 * daysToAdd] ; per Aggiungi giorno ma non è perfetto ... –