Como faço para adicionar 1 dia a um NSDate?

Basicamente, como o título diz. Eu estou querendo saber como eu poderia adicionar 1 dia a um NSDate .

Então, se fosse:

 21st February 2011 

Isso se tornaria:

 22nd February 2011 

Ou se fosse:

 31st December 2011 

Isso se tornaria:

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

Isso deve ser autoexplicativo.

Desde o iOS 8, você pode usar o NSCalendar.dateByAddingUnit

Exemplo no 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) 

Tente isso

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

Uma implementação Swift 3 & 4 em funcionamento com base na resposta da Andy e como uma extensão de Data com opções adicionais para alterar ano, mês e 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) } } 

O uso para adicionar apenas um dia, conforme solicitado pelo OP, seria:

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

Use a function abaixo e use dias paramater para obter a data daysAhead / daysBehind apenas passe o parâmetro como positivo para data futura ou negativo para datas 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; } 

Em rápida

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

Implementação muito simples do Swift 3.0 seria:

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

Isso funciona!

  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 (o mesmo que o Swift 3.0 nesta resposta maravilhosa, apenas deixando claro para novatos como eu)

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

Você pode usar o método de NSDate - (id)dateByAddingTimeInterval:(NSTimeInterval)seconds onde seconds seriam 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]); 

No Swift 2.1.1 e xcode 7.1 OSX 10.10.5, você pode adicionar qualquer número de dias para frente e para trás usando a function

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

chamada de function para incrementar a data atual por 9 dias

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

chamada de function para decrementar a data atual por 80 dias

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

Aqui está um método de propósito geral que permite adicionar / subtrair qualquer tipo de unidade (Ano / Mês / Dia / Hora / Segundo, etc.) na data especificada.

Usando o 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 – Eu pensei que isso iria funcionar para mim. No entanto, se você usá-lo para adicionar um dia a 31 de março de 2013, ele retornará uma data que tenha apenas 23 horas adicionada a ele. Pode realmente ter o 24, mas usando em cálculos tem apenas 23:00 horas adicionadas.

Da mesma forma, se você avançar até 28 de outubro de 2013, o código adicionará 25 horas, resultando em uma data de 2013-10-28 01:00:00.

Muito estranho.

Para adicionar um dia eu estava fazendo a coisa no topo, adicionando:

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

Mas isso foi uma verdadeira bagunça para determinadas datas, principalmente devido à economia de luz do dia.

Objetivo-C, as datas são um pesadelo.

Em swift você pode fazer extensão para adicionar método em 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) } } 

você pode usar isso como

 NSDate().addNoOfDays(3) 

Swift 4, se tudo o que você realmente precisa é de um turno de 24 horas (60 * 60 * 24 segundos) e não “1 dia de calendar”

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

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

para o rápido 2.2:

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

Espero que isso ajude alguém!

Use o seguinte código:

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

Como

 addTimeInterval 

está agora obsoleto.

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

Eu tive o mesmo problema; use uma extensão 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)