2013-03-25 10 views
10

Muszę uzyskać poprzedni tydzień i miesiąc od bieżącej daty.NSDate otrzyma poprzedni tydzień, numer poprzedniego wydania

Więc znalazłem rozwiązanie, które może ponownie wyznaczyć aktualną datę dodanie przerwy między

- dateByAddingTimeInterval 

I to params do niego:

[[NSDate date] dateByAddingTimeInterval: -604800.0] (dla uzyskania poprzedni tydzień)

[[NSDate date] dateByAddingTimeInterval: -2629743.83] (dla uzyskania poprzedni miesiąc)

Tak jak myślę, że do uzyskania tygodnia, ta metoda działa dobrze bez problemu, ponieważ każdego tygodnia ma siedem dni, a okres nie ulega zmianie. Ale przez miesiąc mamy problem, ponieważ każdy miesiąc ma różną liczbę dni.

+0

To będzie przerwy nawet na tygodnie w regionach, które zmieniają czas na letni, ponieważ tydzień w dniach przełączania byłby krótszy/dłuższy o jedną godzinę. – dasblinkenlight

Odpowiedz

35

Korzystanie NSDateComponents byłoby łatwe i dokładne

NSCalendar *calendar = [NSCalendar currentCalendar]; 
NSDateComponents *comps = [NSDateComponents new]; 
comps.month = -1; 
comps.day = -1; 
NSDate *date = [calendar dateByAddingComponents:comps toDate:[NSDate date] options:0]; 
NSDateComponents *components = [calendar components:NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date]; // Get necessary date components 
NSLog(@"Previous month: %d",[components month]); 
NSLog(@"Previous day : %d",[components day]); 
+3

Czy to automatycznie obsłuży zmianę roku? – Siriss

+0

Działa ... utrzymuj (Y) –

9

Nie używaj 903484 i -23484 do zmiany daty

Czy w ten sposób:

NSCalendar *gregorian=[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *components=[[NSDateComponents alloc] init]; 

components.month=1;//next month 
components.month=-1;//previous month 
//similarly +1 and -1 will give you week and month day etc 
components.week=1; 
components.day=1; 

NSDate *myMonth=[gregorian dateByAddingComponents:components toDate:today options:0]; 
NSDateComponents *components = [calendar components:NSMonthCalendarUnit|NSDayCalendarUnit fromDate:date]; 
NSInteger yourRequiredValue=[components day]; //day, month, week etc