Iphone NSDate减去一个月

Iphone NSDate减去一个月,iphone,objective-c,nsdate,nsdatecomponents,Iphone,Objective C,Nsdate,Nsdatecomponents,我要一年两个月,一个月前一个月。e、 g.现在是2011-01我怎样才能获得2010-12。加法是一回事,但我想减法 NSDate *date = [NSDate date]; NSDateComponents *dateComponents = [calendar components:unitFlags fromDate:date]; NSInteger year = [dateComponents year]; NSInteger month = [dateComponents month

我要一年两个月,一个月前一个月。e、 g.现在是2011-01我怎样才能获得2010-12。加法是一回事,但我想减法

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致意

编辑:我的解决方案

    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];
NSDate*date=[NSDate-date];
NSDateComponents*dateComponents=[日历组件:unitFlags fromDate:date];
NSInteger year=[dateComponents year];
NSInteger month=[dateComponents month];
月份-=第1个月;
如果(月份<1){
年份-=1;
月=12;
}
[日历发布];
NSString*pdf_name=[NSString stringWithFormat:@“file_%d_%02d.pdf”,年,月];

此示例代码来自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);

我希望这有帮助

虽然被接受的答案有效,但它使用的代码在iOS 8.0中已贬值。不使用不推荐使用的代码执行相同操作的另一种方法如下:

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

我建议为此创建一个扩展:

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)

抱歉,当我使用你的解决方案时,我得到:4021-12-12 08:32:40+0000Huh,这太奇怪了。这是我的输出:2011-01-06 03:49:28+0000和2010-12-06 03:49:28+0000。我很想听到一个解释,为什么我们会看到不同的结果。我明白了,sry我使用了旧的VAR。我真丢脸!很高兴知道!一、 首先,我很惊讶,
NSDate
没有处理更多的问题。虽然我理解他们为什么要分离出这个功能,但让
NSDate
处理更多这类东西似乎更符合苹果的模式。@donkim:你能链接到那个编程指南吗,即使它只是一个亚马逊链接?我搜索了一下,没有找到任何叫那个名字的东西。谢谢,Np!编辑:边缘情况下的固定月份
let now = Date()
let sixMonthsBefore = now.adding(months: -6)
let threeMonthsAfter = now.adding(months: 3)