2011-01-06 8 views
19

두 달의 NSInteger 년 월이 한 달 뒤로 가고 싶습니다. 예 : 지금은 입니다. 2011-01 어떻게받을 수 있습니까 2010-12. 추가는 한 가지이지만, 빼기를 원합니다. 누군가 나를 좀 도와 줄 수 있기를 바랍니다.NSDate 한 달 어제

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

는 엔도에게

편집을 맞이 : 내 솔루션

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

답변

57

이 샘플 코드는 아이폰의 날짜 및 시간 프로그래밍 가이드에서입니다.

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

이 정보가 도움이되기를 바랍니다.

+0

에서 고정 개월 내 솔루션을 함께 간다면 미안 해요 : 4021-12-12 08:32:40 +0000 –

+0

어, 이상 하네. 내 출력은 다음과 같습니다. 2011-01-06 03:49:28 +0000 및 2010-12-06 03:49:28 +0000. 왜 우리가 다른 결과를보고 있는지에 대한 설명을 듣고 싶습니다. – donkim

+0

이것이 올바른 방법입니다. –

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를! 수정 : 가장자리 케이스 – Penang

5

허용되는 답변이 작동하는 동안 iOS 8.0에서 감가 상각 된 코드가 사용됩니다. 다음과 같이 사용되지 않는 코드를 사용하지 않고 같은 일을하는 또 다른 방법은 다음과 같습니다

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

나는이 목적을 위해 확장을 만드는 것이 좋습니다 :

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

} 

사용법 :

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