Come posso calcolare la differenza tra due date?

Come posso calcolare i giorni tra il 1 gennaio 2010 e (ad esempio) il 3 febbraio 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); 

MODIFICARE:

Ricorda, NSDate oggetti NSDate rappresentano i momentjs esatti del tempo, non hanno alcuna informazione sul fuso orario associata. Quando si converte una stringa in una data utilizzando, ad esempio, un NSDateFormatter , NSDateFormatter converte l’ora dal fuso orario configurato. Pertanto, il numero di secondi tra due oggetti NSDate sarà sempre indipendente dal fuso orario.

Inoltre, questa documentazione specifica che l’implementazione del tempo di Cocoa non tiene conto dei secondi bisestili, quindi se si richiede tale precisione, sarà necessario eseguire la propria implementazione.

Potresti voler usare qualcosa come questo:

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

Credo che questo metodo tenga conto di situazioni come le date che coprono un cambiamento nell’ora legale.

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

dove date2 e date2 sono NSDate .

Inoltre, si noti la definizione di NSTimeInterval :

 typedef double NSTimeInterval; 

Dai un’occhiata a questo. Si occupa dell’ora legale, anno bisestile in quanto utilizzava il calendario iOS per calcolare. È ansible modificare la stringa e le condizioni per includere minuti con ore e giorni.

 +(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
Prova questo e vedi (intervallo di date 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) 

È ansible trovare la differenza convertendo la data in secondi e prendendo intervallo di tempo dal 1970 per questo e quindi è ansible trovare la differenza tra due date.