Получить точную разницу во времени между двумя NSDate? - PullRequest
10 голосов
/ 05 декабря 2011

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

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

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

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

Ответы [ 4 ]

25 голосов
/ 05 декабря 2011

Из 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];
15 голосов
/ 05 декабря 2011

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

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

2 голосов
/ 05 декабря 2011

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

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

0 голосов
/ 30 декабря 2017

Небольшое обновление кода для последней 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];
...