iphone - google - ¿Cómo agrego 1 día a un NSDate?
como poner cuenta de google en iphone (24)
Básicamente, como dice el título. Me pregunto cómo podría agregar 1 día a un NSDate
.
Así que 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.
¡Es trabajo!
let today = Date()
let yesterday = Calendar.current.date(byAdding: .day, value: -1, to: now)
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)
En Swift 2.1.1 y xcode 7.1 OSX 10.10.5, puede agregar cualquier número de días hacia adelante y hacia atrás usando la función
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];
función llamada para incrementar la fecha actual en 9 días
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]);
función llamada para disminuir la fecha actual por 80 días
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!
}
En swift puedes hacer extensiones para agregar métodos en NSDate
NSDateComponents *dayComponent = [[[NSDateComponents alloc] init] autorelease];
dayComponent.day = 1;
NSCalendar *theCalendar = [NSCalendar currentCalendar];
dateToBeIncremented = [theCalendar dateByAddingComponents:dayComponent toDate:dateToBeIncremented options:0];
puedes usar esto como
NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*daysToAdd];
En veloz
let today = Date() // date is then today for this example
let tomorrow = today.add([.day: 1])
Este es 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.
Utilizando Swift 2.2
var newDate = addDaystoGivenDate(NSDate(), NumberOfDaysToAdd: 9)
print(newDate)
La implementación muy simple de Swift 3.0 sería:
var dayComponenet = NSDateComponents()
dayComponenet.day = 1
var theCalendar = NSCalendar.currentCalendar()
var nextDate = theCalendar.dateByAddingComponents(dayComponenet, toDate: NSDate(), options: nil)
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];
Puede usar el método de NSDate - (id)dateByAddingTimeInterval:(NSTimeInterval)seconds
donde los seconds
serían 60 * 60 * 24 = 86400
Swift 2.0
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);
Swift 4, si lo que realmente necesita 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))
Una implementación Swift 3 y 4 basada en respuesta y comentario . Esta extensión de fecha también tiene opciones adicionales para cambiar el año, mes y 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 solo agregar 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)
Usa el siguiente código:
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)
}
}
Como
NSDate().addNoOfDays(3)
ahora está en desuso.
Use la función a continuación y use el parámetro de días para obtener la fecha daysAhead / daysBehind simplemente pase el parámetro como positivo para la fecha futura o negativo para las fechas anteriores:
extension Date {
/// Returns a Date with the specified amount of calendar components added to the one it is called with
func add(_ components: [Calendar.Component: Int]) -> Date {
var targetDate = self
components.forEach { targetDate = Calendar.current.date(byAdding: $0.key, value: $0.value, to: self)! }
return targetDate
}
/// Returns a Date with the specified amount of calendar components subtracted from the one it is called with
func subtract(_ components: [Calendar.Component: Int]) -> Date {
var negativeComponents = [Calendar.Component: Int]()
components.forEach { negativeComponents[$0.key] = -1 * $0.value }
return add(negativeComponents)
}
}
Yo tuve el mismo problema; use una extensión para NSDate:
let today = NSDate()
let tomorrow = NSCalendar.currentCalendar().dateByAddingUnit(
.Day,
value: 1,
toDate: today,
options: NSCalendarOptions.MatchStrictly)
iOS 8+, OSX 10.9+, Objective-C
NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *tomorrow = [cal dateByAddingUnit:NSCalendarUnitDay
value:1
toDate:[NSDate date]
options:0];
para Swift 2.2:
NSDate *now = [NSDate date];
int daysToAdd = 1;
NSDate *newDate1 = [now dateByAddingTimeInterval:60*60*24*daysToAdd];
¡Espero que esto ayude a alguien!
Swift 3+: prueba esta extensión común
- (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 4.0 (igual que Swift 3.0 en esta maravillosa respuesta, para dejarlo claro para los novatos como yo)
+ (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;
}
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];
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 explicarse por sí mismo.
addTimeInterval
func dateByAddingDays(inDays:NSInteger)->Date{
let today = Date()
return Calendar.current.date(byAdding: .day, value: inDays, to: today)!
}
newDate = addDaystoGivenDate(NSDate(), NumberOfDaysToAdd: -80)
print(newDate)
Ok, pensé que esto iba a funcionar para mí. Sin embargo, si lo usa para agregar un día al 31 de marzo de 2013, devolverá una fecha que solo tiene 23 horas agregadas. Puede que en realidad tenga el 24, pero el uso en los cálculos tiene solo 23:00 horas agregadas.
De manera similar, si avanza hasta el 28 de octubre de 2013, el código agrega 25 horas, lo que resulta en una fecha de 2013-10-28 01:00:00.
Muy extraño.
Para agregar un día estaba haciendo la cosa en la parte superior, agregando:
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
Pero esto fue un verdadero desastre para ciertas fechas, principalmente debido al horario de verano.
Objective-C, las fechas son una pesadilla.