2013-04-10 7 views
5

Czy brakuje mi czegoś o tym, jak NSDate dateByAddingTimeInterval działa z dniami? Oto mój kod odejmowania 33 dni od określonej daty (AIDate). AIDate ma wartość czasu równą 00:00 PST.NSDate dateByAddingTimeInterval odejmowanie dni nieprawidłowo zmienia czas

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

Jeżeli AIDate równa 4-9-2013 00:00 PST, powyższy kod odjąć 33 dni i 1 godzinę, co przekłada się na 3-6-2013 23:00 PST.

+2

Twoim problemem jest prawdopodobnie czas letni. Nigdy nie używaj 24 * 60 * 60 do wyrażenia "1 dzień". –

+0

@ MatthiasBauch tak, prawo do tego wymogu NSDateComponents jest lepsze ... –

+0

@MatthiasBauch Ah - to ma sens - dzięki za publikację! – Aaron

Odpowiedz

11

24 * 60 * 60 oznacza 24 godzin, a nie 1 dzień. Istnieje ogromna różnica między tymi dwoma, gdy obliczenia przekraczają zmianę z lub do czasu letniego.

Przypadkowo 33 dni temu nie było czasu letniego w Twojej strefie czasowej.

Poprawnym sposobem na to jest użycie NSDateComponents. W ten sposób:

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

można to zrobić z kodem poniżej ..

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

mam nadzieję, że jest to pomocne dla Ciebie ...

+0

To działa poprawnie - dziękuję za opublikowanie. Czy jest jakiś pomysł, dlaczego mój kod odjąłby go niepoprawnie? – Aaron

+0

@Aaron dla swoich wymagań, jeśli to możliwe, użyj NSDateComponents, które dadzą ci idealną wydajność .. lepiej dla ciebie .. tutaj możesz również użyć tego typu przepływu NSDate * newDate1 = [teraz addTimeInterval: 60 * 60 * 24 * daysToAdd] ; dla Dodaj dzień, ale nie jest idealny ... –