¿Cómo puedo calcular la diferencia entre dos fechas?

¿Cómo puedo calcular los días entre el 1 de enero de 2010 y (por ejemplo) el 3 de febrero de 2010?

NSDate *date1 = [NSDate dateWithString:@"2010-01-01 00:00:00 +0000"]; NSDate *date2 = [NSDate dateWithString:@"2010-02-03 00:00:00 +0000"]; NSTimeInterval secondsBetween = [date2 timeIntervalSinceDate:date1]; int numberOfDays = secondsBetween / 86400; NSLog(@"There are %d days in between the two dates.", numberOfDays); 

EDITAR:

Recuerde, los objetos NSDate representan momentos exactos de tiempo, no tienen ninguna información de zona horaria asociada. Cuando convierte una cadena en una fecha usando, por ejemplo, un NSDateFormatter , NSDateFormatter convierte el tiempo de la zona horaria configurada. Por lo tanto, el número de segundos entre dos objetos NSDate siempre será un agnóstico de zona horaria.

Además, esta documentación especifica que la implementación del tiempo de Cocoa no representa los segundos intercalares, por lo que si necesita dicha precisión, deberá implementar su propia implementación.

Puede usar algo como esto:

 NSDateComponents *components; NSInteger days; components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit fromDate: startDate toDate: endDate options: 0]; days = [components day]; 

Creo que este método tiene en cuenta situaciones tales como las fechas que abarcan un cambio en el horario de verano.

 NSTimeInterval diff = [date2 timeIntervalSinceDate:date1]; // in seconds 

donde date1 y date2 son NSDate .

Además, tenga en cuenta la definición de NSTimeInterval :

 typedef double NSTimeInterval; 

Mira esto. Se encarga del horario de verano y del año bisiesto, ya que usó el calendario de iOS para calcular. Puede cambiar la cadena y las condiciones para incluir minutos con horas y días.

 +(NSString*)remaningTime:(NSDate*)startDate endDate:(NSDate*)endDate { NSDateComponents *components; NSInteger days; NSInteger hour; NSInteger minutes; NSString *durationString; components = [[NSCalendar currentCalendar] components: NSCalendarUnitDay|NSCalendarUnitHour|NSCalendarUnitMinute fromDate: startDate toDate: endDate options: 0]; days = [components day]; hour = [components hour]; minutes = [components minute]; if(days>0) { if(days>1) durationString=[NSString stringWithFormat:@"%d days",days]; else durationString=[NSString stringWithFormat:@"%d day",days]; return durationString; } if(hour>0) { if(hour>1) durationString=[NSString stringWithFormat:@"%d hours",hour]; else durationString=[NSString stringWithFormat:@"%d hour",hour]; return durationString; } if(minutes>0) { if(minutes>1) durationString = [NSString stringWithFormat:@"%d minutes",minutes]; else durationString = [NSString stringWithFormat:@"%d minute",minutes]; return durationString; } return @""; } 

Swift 4
Pruebe esto y vea (rango de fechas con String):

 // Start & End date string let startingAt = "01/01/2018" let endingAt = "08/03/2018" // Sample date formatter let dateFormatter = DateFormatter() dateFormatter.dateFormat = "dd/MM/yyyy" // start and end date object from string dates var startDate = dateFormatter.date(from: startingAt) ?? Date() let endDate = dateFormatter.date(from: endingAt) ?? Date() // Actual operational logic var dateRange: [String] = [] while startDate < = endDate { let stringDate = dateFormatter.string(from: startDate) startDate = Calendar.current.date(byAdding: .day, value: 1, to: startDate) ?? Date() dateRange.append(stringDate) } print("Resulting Array - \(dateRange)") 

Swift 3

 var date1 = Date(string: "2010-01-01 00:00:00 +0000") var date2 = Date(string: "2010-02-03 00:00:00 +0000") var secondsBetween: TimeInterval = date2.timeIntervalSince(date1) var numberOfDays: Int = secondsBetween / 86400 print(numberOfDays) 

Puede encontrar la diferencia al convertir la fecha en segundos y tomar un intervalo de tiempo desde 1970 para esto y luego puede encontrar la diferencia entre dos fechas.