Получите точную разницу во времени между двумя 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];