dateByAddingComponents y conseguir la diferencia de fechas con NSDateComponents
-
22-09-2019 - |
Pregunta
Estoy teniendo problemas con la adición de los valores de fechas y también conseguir diferencias entre fechas. Las fechas y los componentes calculados son incorrectos.
Así que para añadir, si añado 1,5 meses, solo me dan 1 mes, sin embargo si añado cualquier número entero es decir, (1 o 2 o 3 y etc) se calcula correctamente.
Float32 addAmount = 1.5;
NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
[components setMonth:addAmount];
NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
[gregorian setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
NSDate *newDate2 = [gregorian dateByAddingComponents:components toDate:Date1 options:0];
Ahora la diferencia, si tengo una fecha que se ha añadido con exactamente un año (casi el mismo código que el anterior), se añade correctamente, pero cuando se calcula la diferencia, me sale 0 años, 11 meses y 30 días.
NSDate *startDate = Date1;
NSDate *endDate = Date2;
NSCalendar *gregorian = [[NSCalendar alloc]
initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
NSDateComponents *components = [gregorian components:unitFlags
fromDate:startDate
toDate:endDate options:0];
NSInteger years = [components year];
NSInteger months = [components month];
NSInteger days = [components day];
¿Qué estoy haciendo mal? También he añadido la constanct kCFCalendarComponentsWrap en las opciones para ambas funciones suma y diferencia, pero sin diferencias.
Gracias
Solución
Así que para añadir, si añado 1,5 meses, sólo se obtiene 1 mes, sin embargo si añado cualquier es decir, número entero (1 o 2 o 3 y etc) se calcula correctamente.
El método setMonth:
en NSDateComponents
toma un NSInteger
, no un número de coma flotante. Por lo que el comportamiento es correcto, ya que es simplemente truncar el 1,5 a 1.
Ahora la diferencia, si tengo una fecha que se ha añadido con exactamente un año (casi mismo código que el anterior), se agrega correctamente, pero cuando el se calcula la diferencia, consigo 0 años, 11 meses y 30 días.
A menos que usted muestra el código de cómo se crean las variables FECHA1 y FECHA2, no hay manera verdadera de decir.
(También está perdiendo memoria anteriormente;. Siempre coincidir con un alloc con un release
/ autorelease
y tratar de no dar sus cartas variables de capital, ya que, como una cuestión de estilo, que sólo debe ser hecho por los nombres de clase)
Otros consejos
Finalmente encontré el problema con la diferencia de fechas, cuando estaba guardando a una db, solía timeintervalsince1970 con un valor doble, pero cuando poblarlo y se establece a un selector de fechas, que estaba usando un tipo de columna int.
Gracias lanudo de la rana para mí de dirección en la dirección correcta.