2011-01-06 97 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

此示例代碼是從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); 

我希望這有助於!

+0

對不起,當我即將與您的解決方案即時獲得:4021-12-12 08:32:40 +0000 – 2011-01-06 03:47:56

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 2011-01-06 04:58:01

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)