2009-07-21 12 views
25

Chciałbym odjąć 4 godziny od daty. Przeczytałem ciąg daty w obiekcie NSDate za pomocą następującego kodu:Jak odjąć godziny od NSDate?

NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZ"]; 
NSDate * mydate = [dateFormatter dateFromString:[dict objectForKey:@"published"]]; 

Co mam zrobić dalej?

+4

(To już 6 lat i 4 główne wersje XCode później ... a funkcjonalność NSDate jest nadal tak samo nieintuicyjna jak w 2009 roku!). –

Odpowiedz

23

NSCalendar to ogólny interfejs API służący do zmiany dat w oparciu o jednostki czasu. W tym celu można użyć NSCalendar's -dateByAddingComponents:toDate:options: z ujemną liczbą godzin.

+0

Jest to o wiele lepsze podejście - dotyczy DST, lat przestępnych, wszystkiego. – drewh

+0

NSCalendar nie jest polecanym interfejsem API do użycia. http://developer.apple.com/documentation/Cocoa/Reference/Foundation/Classes/NSCalendarDate_Class/Reference/Reference.html – oberbaum

+10

@norskben: Strona dla NSCalendar ** Data **. To właśnie mówi, żeby nie używać. Zaleca NSCalendar jako zamiennik w tej samej notatce. – Chuck

45
NSDate *newDate = [theDate dateByAddingTimeInterval:-3600*4]; 

Link to documentation.


NSDate *newDate = [[[NSDate alloc] initWithTimeInterval:-3600*4 
               sinceDate:theDate]] autorelease]; 

Link to documentation.

+0

stare pytanie Wiem, ale addTimeInterval wydaje się być przestarzałe teraz, czy istnieje ku temu powód? –

+3

@DreamLane: ponieważ nie używał tej samej konwencji nazewnictwa, co reszta interfejsu API. 'addTimeInterval:' sugeruje, że 'NSDate' jest zmienną, której nie ma. –

+1

Dziękuję za szybką odpowiedź, również za edycję odpowiedzi za pomocą zaktualizowanej nazwy metody! +1 –

1

Hej Miriam,
Funkcja dateFromString zwraca NSDate, a nie NSString. należy zmienić,

NSDate * TheDate = [dateFormatter dateFromString: datetemp];

nadzieję, że to pomaga,
bests.
G.

6

Od iOS 8 jest bardziej wygodny dateByAddingUnit:

Swift 2.x

//subtract 3 hours 
let calendar = NSCalendar.autoupdatingCurrentCalendar() 
newDate = calendar.dateByAddingUnit(.Hour, value: -3, toDate: originalDate, options: []) 
+1

Komentarz mówi, że odejmowanie 3 było używane jako wartość, zamiast tego powinno być -3 – naz

+0

Dzięki, zaktualizowane. –

4
//in Swift 3 
//subtract 3 hours 
let calendar = NSCalendar.autoupdatingCurrent 
newDate = calendar.date(byAdding:.hour, value: -3, to: originalDate)