如何添加一个月到一个NSDate?

如何将月份添加到NSDate对象?

NSDate *someDate = [NSDate Date] + 30Days.....; 

你需要使用NSDateComponents

 NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; [dateComponents setMonth:1]; NSCalendar *calendar = [NSCalendar currentCalendar]; NSDate *newDate = [calendar dateByAddingComponents:dateComponents toDate:originalDate options:0]; [dateComponents release]; // If ARC is not used, release the date components 

使用iOS 8和OS X 10.9,您可以使用NSCalendar添加NSCalendar

Objective-C的

 NSCalendar *cal = [NSCalendar currentCalendar]; NSDate *someDate = [cal dateByAddingUnit:NSCalendarUnitMonth value:1 toDate:[NSDate date] options:0]; 

Swift 3

 let date = Calendar.current.date(byAdding: .month, value: 1, to: Date()) 

Swift 2

 let cal = NSCalendar.currentCalendar() let date = cal.dateByAddingUnit(.Month, value: 1, toDate: NSDate(), options: []) 

例如,要在Swift中为当前date添加3个月:

 let date = NSCalendar.currentCalendar().dateByAddingUnit(.MonthCalendarUnit, value: 3, toDate: NSDate(), options: nil)! 

在Swift 2.0中:

 let date = NSCalendar.currentCalendar().dateByAddingUnit(.Month, value: 3, toDate: NSDate(), options: []) 
  • NSCalendarUnit的新的OptionSetType结构让你更简单地指定.Month
  • 采用OptionSetType参数(如options:参数,采用NSCalendarOptions )不能nil ,因此传入空集( [] )来表示“无选项”。

在Swift 2.0中

  let startDate = NSDate() let dateComponent = NSDateComponents() dateComponent.month = 1 let cal = NSCalendar.currentCalendar() let endDate = cal.dateByAddingComponents(dateComponent, toDate: startDate, options: NSCalendarOptions(rawValue: 0)) 

对于迅速3.0

 extension Date { func addMonth(n: Int) -> Date { let cal = NSCalendar.current return cal.date(byAdding: .month, value: n, to: self)! } func addDay(n: Int) -> Date { let cal = NSCalendar.current return cal.date(byAdding: .day, value: n, to: self)! } func addSec(n: Int) -> Date { let cal = NSCalendar.current return cal.date(byAdding: .second, value: n, to: self)! } } 

你想添加一个“月”还是正好30天? 如果是30天,你这样做:

 // get a date NSDate *date = [NSDate dateWithNaturalLanguageString:@"2011-01-02"]; // add 30 days to it (in seconds) date = [date dateByAddingTimeInterval:(30 * 24 * 60 * 60)]; NSLog(@"%@", date); // 2011-02-01 

注意:这不会将夏令时转换或闰秒考虑在内。 如果您需要,请使用@ TheEye的答案

适用于SWIFT 3.0

这里是function,你可以通过任何计数例如在这里减less日,月,日,我已经减less了当前系统date年100年,你可以做它的日,月也只是设置计数器,然后存储值在数组中,并做任何你想要做的数组

 func currentTime(){ let date = Date() let calendar = Calendar.current var year = calendar.component(.year, from: date) let month = calendar.component(.month, from: date) let day = calendar.component(.day, from: date) let pastyear = year - 100 var someInts = [Int]() printLog(msg: "\(day):\(month):\(year)" ) for _ in pastyear...year { year -= 1 print("\(year) ") someInts.append(year) } print(someInts) } 

其他答案工作正常,如果你想要的行为是增加一个月,并允许夏时制。 这产生了如下结果:

 01/03/2017 00:00 + 1 month -> 31/03/2017 23:00 01/10/2017 00:00 + 1 month -> 01/11/2017 01:00 

但是我想忽略DST丢失或获得的时间,例如:

 01/03/2017 00:00 + 1 month -> 01/04/2017 00:00 01/10/2017 00:00 + 1 month -> 01/11/2017 00:00 

因此,我检查是否通过了DST边界,如果是,则相应地增加或减去一个小时:

 func offsetDaylightSavingsTime() -> Date { // daylightSavingTimeOffset is either + 1hr or + 0hr. To offset DST for a given date, we need to add an hour or subtract an hour // +1hr -> +1hr // +0hr -> -1hr // offset = (daylightSavingTimeOffset * 2) - 1 hour let daylightSavingsTimeOffset = TimeZone.current.daylightSavingTimeOffset(for: self) let oneHour = TimeInterval(3600) let offset = (daylightSavingsTimeOffset * 2) - oneHour return self.addingTimeInterval(offset) } func isBetweeen(date date1: Date, andDate date2: Date) -> Bool { return date1.compare(self).rawValue * self.compare(date2).rawValue >= 0 } func offsetDaylightSavingsTimeIfNecessary(nextDate: Date) -> Date { if let nextDST = TimeZone.current.nextDaylightSavingTimeTransition(after: self) { if nextDST.isBetweeen(date: self, andDate: nextDate){ let offsetDate = nextDate.offsetDaylightSavingsTime() let difference = offsetDate.timeIntervalSince(nextDate) return nextDate.addingTimeInterval(difference) } } return nextDate } func dateByAddingMonths(_ months: Int) -> Date? { if let dateWithMonthsAdded = Calendar.current.date(byAdding: .month, value: months, to: self) { return self.offsetDaylightSavingsTimeIfNecessary(nextDate: dateWithMonthsAdded) } return self } 

testing:

 func testDateByAddingMonths() { let date1 = "2017-01-01T00:00:00Z".asDate() let date2 = "2017-02-01T00:00:00Z".asDate() let date3 = "2017-03-01T00:00:00Z".asDate() let date4 = "2017-04-01T00:00:00Z".asDate() let date5 = "2017-05-01T00:00:00Z".asDate() let date6 = "2017-06-01T00:00:00Z".asDate() let date7 = "2017-07-01T00:00:00Z".asDate() let date8 = "2017-08-01T00:00:00Z".asDate() let date9 = "2017-09-01T00:00:00Z".asDate() let date10 = "2017-10-01T00:00:00Z".asDate() let date11 = "2017-11-01T00:00:00Z".asDate() let date12 = "2017-12-01T00:00:00Z".asDate() let date13 = "2018-01-01T00:00:00Z".asDate() let date14 = "2018-02-01T00:00:00Z".asDate() var testDate = "2017-01-01T00:00:00Z".asDate() XCTAssertEqual(testDate, date1) testDate = testDate.dateByAddingMonths(1)! XCTAssertEqual(testDate, date2) testDate = testDate.dateByAddingMonths(1)! XCTAssertEqual(testDate, date3) testDate = testDate.dateByAddingMonths(1)! XCTAssertEqual(testDate, date4) testDate = testDate.dateByAddingMonths(1)! XCTAssertEqual(testDate, date5) testDate = testDate.dateByAddingMonths(1)! XCTAssertEqual(testDate, date6) testDate = testDate.dateByAddingMonths(1)! XCTAssertEqual(testDate, date7) testDate = testDate.dateByAddingMonths(1)! XCTAssertEqual(testDate, date8) testDate = testDate.dateByAddingMonths(1)! XCTAssertEqual(testDate, date9) testDate = testDate.dateByAddingMonths(1)! XCTAssertEqual(testDate, date10) testDate = testDate.dateByAddingMonths(1)! XCTAssertEqual(testDate, date11) testDate = testDate.dateByAddingMonths(1)! XCTAssertEqual(testDate, date12) testDate = testDate.dateByAddingMonths(1)! XCTAssertEqual(testDate, date13) testDate = testDate.dateByAddingMonths(1)! XCTAssertEqual(testDate, date14) } 

为了完整性,我正在使用.asDate()方法

 extension String { static let dateFormatter = DateFormatter() func checkIsValidDate() -> Bool { return self.tryParseToDate() != nil } func tryParseToDate() -> Date? { String.dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ" return String.dateFormatter.date(from: self) } func asDate() -> Date { return tryParseToDate()! } }