2011-01-06 12 views
19

Quiero dos años NSInteger, mes para un mes atrás. p.ej. ahora es 2011-01 cómo puedo obtener 2010-12. agregar es una cosa, pero quiero restar. Espero que alguien pueda ayudarme un poco aquí.NSDate restar un mes

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

saluda endo

EDIT: Mi solución

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

Respuesta

57

Este código de muestra es de Guía de programación de fecha y hora de iPhone.

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

Espero que esto ayude!

+0

Lo siento cuando voy con su solución estoy recibiendo: 4021-12-12 08:32:40 +0000 –

+0

Huh, eso es extraño. Aquí está mi salida: 2011-01-06 03:49:28 +0000 y 2010-12-06 03:49:28 +0000. Me encantaría escuchar una explicación de por qué estamos viendo resultados diferentes. – donkim

+0

Esta es la forma correcta de hacerlo. –

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! Editar: mes fijo en caso de borde – Penang

5

Si bien la respuesta aceptada funciona, usa el código depreciado en iOS 8.0. Otra forma de hacer lo mismo sin necesidad de utilizar código obsoleto es el siguiente:

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

Sugiero crear una extensión para este propósito:

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) 
    } 

} 

Uso:

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