2011-01-06 19 views
19

İki NSInteger yıl, ay bir ay geri gitmek istiyorum. Örneğin. şimdi 2011-012010-12'u nasıl edinebilirim? ekleyerek bir şey, ama ben bırakmak istiyorum. Umarım birisi bana biraz yardımcı olabilir.NSDate substract bir ay

NSDate *date = [NSDate date]; 
NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date]; 
NSInteger year = [dateComponents year]; 
NSInteger month = [dateComponents month]; 
[calendar release]; 
NSString * pdf_name = [NSString stringWithFormat:@"file_%d_%02d.pdf", year, month]; 

Endo

EDIT selamlıyor: Benim çözümüm

NSCalendar *calendar= [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSCalendarUnit unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; 

NSDate *date = [NSDate date]; 
NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date]; 
NSInteger year = [dateComponents year]; 
NSInteger month = [dateComponents month]; 

BOOL substractOneMonth = YES; 
if (substractOneMonth) { 
    if (month==1) { 
    year--; 
    month = 12; 
    }else { 
    month--; 
    } 
} 
[calendar release]; 

NSString * pdf_name = [NSString stringWithFormat:@"file_%d_%02d.pdf", year, month]; 

cevap

57

Bu örnek kod iPhone'un Tarih ve Saat Program Rehberi olduğunu.

NSDate *today = [[NSDate alloc] init]; 
NSLog(@"%@", today); 
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *offsetComponents = [[NSDateComponents alloc] init]; 
[offsetComponents setMonth:-1]; // note that I'm setting it to -1 
NSDate *endOfWorldWar3 = [gregorian dateByAddingComponents:offsetComponents toDate:today options:0]; 
NSLog(@"%@", endOfWorldWar3); 

Umarım bu yardımcı olur!

+0

Çözünürlüğü ile gidiyorum ne zaman üzgün: 4021-12-12 08:32:40 +0000 –

+0

Huh, bu garip. İşte çıkışım: 2011-01-06 03:49:28 +0000 ve 2010-12-06 03:49:28 +0000. Neden farklı sonuçlar gördüğümüze dair bir açıklama duymak isterim. – donkim

+0

Bunu yapmanın doğru yolu budur. –

1
NSDate *date = [NSDate date]; 
NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date]; 
NSInteger year = [dateComponents year]; 
NSInteger month = [dateComponents month]; 

month -= month - 1; 

if (month < 1) { 
year -= 1; 
month = 12; 
} 

[calendar release]; 
NSString * pdf_name = [NSString stringWithFormat:@"file_%d_%02d.pdf", year, month]; 
+0

Np! Düzenleme: Kenar durumda sabit ay – Penang

5

Kabul edilen yanıt işe yarıyor olsa da, iOS 8.0'da değer kaybeden kodu kullanır. aşağıdaki gibi kullanım dışı kod kullanmadan aynı şeyi yapmak için başka bir yoludur:

NSDate *date = [NSDate date]; 
NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; 
[dateComponents setMonth:-1]; 
date = [[NSCalendar currentCalendar] dateByAddingComponents:dateComponents toDate:date options:0]; 
3

ben bu amaç için bir uzantısı oluşturmanızı öneririz:

extension Date { 

    func adding(months: Int) -> Date? { 
     let calendar = Calendar(identifier: .gregorian) 

     var components = DateComponents() 
     components.calendar = calendar 
     components.timeZone = TimeZone(secondsFromGMT: 0) 
     components.month = months 

     return calendar.date(byAdding: components, to: self) 
    } 

} 

Kullanımı:

let now = Date() 
let sixMonthsBefore = now.adding(months: -6) 
let threeMonthsAfter = now.adding(months: 3)