Получите точную разницу во времени между двумя NSDate?

Есть ли способ узнать точную разницу между двумя NSDate?

Я нашел решения, но они недостаточно точны. Мне нужно учитывать летнее время, тот факт, что разные месяцы имеют разное количество дней и т.д.

Простой расчет, такой как /60/60/24 и т.д. для разработки минут, часов и дней, не учитывает их.

Предположим, мне нужно разобраться в разнице между временем ([NSDate date]) и 25 декабря 10:22 вечера (дата, выбранная пользователем с помощью выбора даты [datePicker date]), как пример, как бы я это сделал?
Знать точную разницу во времени не является ключевым, если у меня есть точная разница в днях, месяцах и годах, это будет делать.

Ответ 1

Из Apple Руководство по программированию даты и времени:

Листинг 12 Получение разницы между двумя датами

NSDate *startDate = ...;
NSDate *endDate = ...;

NSCalendar *gregorian = [[NSCalendar alloc]
                 initWithCalendarIdentifier:NSGregorianCalendar];

NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit;

NSDateComponents *components = [gregorian components:unitFlags
                                          fromDate:startDate
                                          toDate:endDate options:0];
NSInteger months = [components month];
NSInteger days = [components day];

Ответ 2

NSDate полностью не зависит от Timezone. Переход на летнее время даже не подходит для изображения NSDate. Только когда вы конвертируете NSDate в удобочитаемый формат (MM/DD/YY, HH: MM: формат SS или тому подобное), появляется Time Zone.

Убедитесь, что вы учитываете правильный часовой пояс, параметр экономии дневного света, когда вы создаете NSDate (s). Впоследствии метод [date1 timeIntervalSinceDate:date2] должен всегда давать вам точную разницу во времени.

Ответ 3

Итак, более точный вопрос, который вы хотели задать, заключался в следующем: как я могу получить красиво отформатированные дни, месяцы, годы от разницы между двумя датами. Сначала вы хотите получить nsTimerInterval (разность во времени в секундах), а затем отформатировать его:

Как разбить NSTimeInterval на год, месяцы, дни, часы, минуты и секунды на iPhone?

Ответ 4

Небольшое обновление кода для последней версии iOS:

NSDate *startDate = ...;
NSDate *endDate = ...;

NSCalendar *gregorian = [[NSCalendar alloc]
                             initWithCalendarIdentifier:NSCalendarIdentifierGregorian];

NSUInteger unitFlags = NSCalendarUnitMonth | NSCalendarUnitDay;

NSDateComponents *components = [gregorian components:unitFlags
                                            fromDate: startDate
                                              toDate:endDate options:0];
NSInteger months = [components month];
NSInteger days = [components day];