¿Cómo agrego 1 día a NSDate?

Básicamente, como dice el título. Me pregunto cómo podría agregar 1 día a un NSDate .

Entonces si fuera:

 21st February 2011 

Se convertiría en:

 22nd February 2011 

O si fuera:

 31st December 2011 

Se convertiría en:

 1st January 2012. 

 NSDateComponents *dayComponent = [[NSDateComponents alloc] init]; dayComponent.day = 1; NSCalendar *theCalendar = [NSCalendar currentCalendar]; NSDate *nextDate = [theCalendar dateByAddingComponents:dayComponent toDate:[NSDate date] options:0]; NSLog(@"nextDate: %@ ...", nextDate); 

Esto debería ser autoexplicativo.

Desde iOS 8 puedes usar NSCalendar.dateByAddingUnit

Ejemplo en Swift 1.x:

 let today = NSDate() let tomorrow = NSCalendar.currentCalendar() .dateByAddingUnit( .CalendarUnitDay, value: 1, toDate: today, options: NSCalendarOptions(0) ) 

Swift 2.0:

 let today = NSDate() let tomorrow = NSCalendar.currentCalendar() .dateByAddingUnit( .Day, value: 1, toDate: today, options: [] ) 

Swift 3.0:

 let today = Date() let tomorrow = Calendar.current.date(byAdding: .day, value: 1, to: today) 

Prueba esto

  NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; // now build a NSDate object for the next day NSDateComponents *offsetComponents = [[NSDateComponents alloc] init]; [offsetComponents setDay:1]; NSDate *nextDate = [gregorian dateByAddingComponents:offsetComponents toDate: [NSDate date] options:0]; [offsetComponents release]; [gregorian release]; 

iOS 8+, OSX 10.9+, Objective-C

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

Una implementación activa de Swift 3 y 4 basada en la respuesta de Andy y como una extensión de fecha con opciones adicionales para cambiar el año, el mes y la hora:

 extension Date { /// Returns a Date with the specified days added to the one it is called with func add(years: Int = 0, months: Int = 0, days: Int = 0, hours: Int = 0, minutes: Int = 0, seconds: Int = 0) -> Date { var targetDay: Date targetDay = Calendar.current.date(byAdding: .year, value: years, to: self)! targetDay = Calendar.current.date(byAdding: .month, value: months, to: targetDay)! targetDay = Calendar.current.date(byAdding: .day, value: days, to: targetDay)! targetDay = Calendar.current.date(byAdding: .hour, value: hours, to: targetDay)! targetDay = Calendar.current.date(byAdding: .minute, value: minutes, to: targetDay)! targetDay = Calendar.current.date(byAdding: .second, value: seconds, to: targetDay)! return targetDay } /// Returns a Date with the specified days subtracted from the one it is called with func subtract(years: Int = 0, months: Int = 0, days: Int = 0, hours: Int = 0, minutes: Int = 0, seconds: Int = 0) -> Date { let inverseYears = -1 * years let inverseMonths = -1 * months let inverseDays = -1 * days let inverseHours = -1 * hours let inverseMinutes = -1 * minutes let inverseSeconds = -1 * seconds return add(years: inverseYears, months: inverseMonths, days: inverseDays, hours: inverseHours, minutes: inverseMinutes, seconds: inverseSeconds) } } 

El uso para agregar solo un día según lo solicitado por OP sería:

 let today = Date() // date is then today for this example let tomorrow = today.add(days: 1) 

Use la función a continuación y use el parámetro días para obtener la fecha daysAhead / daysDetrás simplemente pase el parámetro como positivo para la fecha futura o negativo para las fechas anteriores:

 + (NSDate *) getDate:(NSDate *)fromDate daysAhead:(NSUInteger)days { NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; dateComponents.day = days; NSCalendar *calendar = [NSCalendar currentCalendar]; NSDate *previousDate = [calendar dateByAddingComponents:dateComponents toDate:fromDate options:0]; [dateComponents release]; return previousDate; } 

En veloz

 var dayComponenet = NSDateComponents() dayComponenet.day = 1 var theCalendar = NSCalendar.currentCalendar() var nextDate = theCalendar.dateByAddingComponents(dayComponenet, toDate: NSDate(), options: nil) 

La implementación muy simple de Swift 3.0 sería:

 func dateByAddingDays(inDays:NSInteger)->Date{ let today = Date() return Calendar.current.date(byAdding: .day, value: inDays, to: today)! } 

¡Es trabajo!

  NSCalendar *calendar = [NSCalendar currentCalendar]; NSCalendarUnit unit = NSCalendarUnitDay; NSInteger value = 1; NSDate *today = [NSDate date]; NSDate *tomorrow = [calendar dateByAddingUnit:unit value:value toDate:today options:NSCalendarMatchStrictly]; 
 NSDate *today=[NSDate date]; NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier: NSGregorianCalendar]; NSDateComponents *components=[[NSDateComponents alloc] init]; components.day=1; NSDate *targetDate =[calendar dateByAddingComponents:components toDate:today options: 0]; 

Swift 4.0 (igual que Swift 3.0 en esta maravillosa respuesta que deja en claro para novatos como yo)

 let today = Date() let yesterday = calendar.date(byAdding: .day, value: -1, to: now) 

Puede usar el método de NSDate - (id)dateByAddingTimeInterval:(NSTimeInterval)seconds donde los seconds serían 60 * 60 * 24 = 86400

 NSDate *now = [NSDate date]; int daysToAdd = 1; NSDate *tomorrowDate = [now dateByAddingTimeInterval:60*60*24*daysToAdd]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"EEEE, dd MMM yyyy"]; NSLog(@"%@", [dateFormatter stringFromDate:tomorrowDate]); 

En Swift 2.1.1 y xcode 7.1 OSX 10.10.5, puede agregar cualquier número de días adelante y atrás usando la función

 func addDaystoGivenDate(baseDate:NSDate,NumberOfDaysToAdd:Int)->NSDate { let dateComponents = NSDateComponents() let CurrentCalendar = NSCalendar.currentCalendar() let CalendarOption = NSCalendarOptions() dateComponents.day = NumberOfDaysToAdd let newDate = CurrentCalendar.dateByAddingComponents(dateComponents, toDate: baseDate, options: CalendarOption) return newDate! } 

Llamada de función para incrementar la fecha actual en 9 días

 var newDate = addDaystoGivenDate(NSDate(), NumberOfDaysToAdd: 9) print(newDate) 

Llamada de función para disminuir la fecha actual en 80 días

 newDate = addDaystoGivenDate(NSDate(), NumberOfDaysToAdd: -80) print(newDate) 

Aquí hay un método de propósito general que le permite agregar / restar cualquier tipo de unidad (año / mes / día / hora / segundo, etc.) en la fecha especificada.

Usando Swift 2.2

 func addUnitToDate(unitType: NSCalendarUnit, number: Int, date:NSDate) -> NSDate { return NSCalendar.currentCalendar().dateByAddingUnit( unitType, value: number, toDate: date, options: NSCalendarOptions(rawValue: 0))! } print( addUnitToDate(.Day, number: 1, date: NSDate()) ) // Adds 1 Day To Current Date print( addUnitToDate(.Hour, number: 1, date: NSDate()) ) // Adds 1 Hour To Current Date print( addUnitToDate(.Minute, number: 1, date: NSDate()) ) // Adds 1 Minute To Current Date // NOTE: You can use negative values to get backward values too 
 NSDateComponents *dayComponent = [[[NSDateComponents alloc] init] autorelease]; dayComponent.day = 1; NSCalendar *theCalendar = [NSCalendar currentCalendar]; dateToBeIncremented = [theCalendar dateByAddingComponents:dayComponent toDate:dateToBeIncremented options:0]; 

Ok, pensé que esto iba a funcionar para mí. Sin embargo, si lo usa para agregar un día hasta el 31 de marzo de 2013, devolverá una fecha que solo tiene 23 horas agregadas. De hecho, puede tener el 24, pero el uso en los cálculos solo tiene 23:00 horas.

Del mismo modo, si avanza hasta el 28 de octubre de 2013, el código agrega 25 horas, lo que da como resultado una fecha de 2013-10-28 01:00:00.

Muy extraño.

Para agregar un día estaba haciendo lo que estaba en la parte superior, agregando:

 NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*daysToAdd]; 

Pero esto fue un verdadero desastre para ciertas fechas, principalmente debido al horario de verano.

Objective-C, las fechas son una pesadilla.

En swift puedes hacer que la extensión agregue el método en NSDate

 extension NSDate { func addNoOfDays(noOfDays:Int) -> NSDate! { let cal:NSCalendar = NSCalendar.currentCalendar() cal.timeZone = NSTimeZone(abbreviation: "UTC")! let comps:NSDateComponents = NSDateComponents() comps.day = noOfDays return cal.dateByAddingComponents(comps, toDate: self, options: nil) } } 

puedes usar esto como

 NSDate().addNoOfDays(3) 

Swift 4, si todo lo que necesitas es un turno de 24 horas (60 * 60 * 24 segundos) y no “1 día calendario”

Futuro: let dayAhead = Date(timeIntervalSinceNow: TimeInterval(86400.0))

Pasado: let dayAgo = Date(timeIntervalSinceNow: TimeInterval(-86400.0))

para swift 2.2:

 let today = NSDate() let tomorrow = NSCalendar.currentCalendar().dateByAddingUnit( .Day, value: 1, toDate: today, options: NSCalendarOptions.MatchStrictly) 

¡Espero que esto ayude a alguien!

Use el siguiente código:

 NSDate *now = [NSDate date]; int daysToAdd = 1; NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*daysToAdd]; 

Como

 addTimeInterval 

ahora está en desuso

 NSDate *now = [NSDate date]; NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents *components = [calendar components:NSYearCalendarUnit|NSMonthCalendarUnit|NSDayCalendarUnit fromDate:now]; NSDate *startDate = [calendar dateFromComponents:components]; NSLog(@"StartDate = %@", startDate); components.day += 1; NSDate *endDate = [calendar dateFromComponents:components]; NSLog(@"EndDate = %@", endDate); 

Yo tuve el mismo problema; use una extensión para NSDate:

 - (id)dateByAddingYears:(NSUInteger)years months:(NSUInteger)months days:(NSUInteger)days hours:(NSUInteger)hours minutes:(NSUInteger)minutes seconds:(NSUInteger)seconds { NSDateComponents * delta = [[[NSDateComponents alloc] init] autorelease]; NSCalendar * gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian] autorelease]; [delta setYear:years]; [delta setMonth:months]; [delta setDay:days]; [delta setHour:hours]; [delta setMinute:minutes]; [delta setSecond:seconds]; return [gregorian dateByAddingComponents:delta toDate:self options:0]; } 

Swift 2.0

 let today = NSDate() let calendar = NSCalendar.currentCalendar() let tomorrow = calendar.dateByAddingUnit(.Day, value: 1, toDate: today, options: NSCalendarOptions.MatchFirst)