NSDate находит ближайшую дату на сегодня

У меня есть отсортированный массив NSDates. Может ли кто-нибудь помочь с тем, как я могу найти дату в массиве, ближайшем к текущей дате?

Мне нужно получить индекс ближайшей даты, чтобы я мог прокручивать эту дату в своем табличном представлении.

Например, если у меня есть 1 января 2013 года, 6 января 2013 года, 9 января 2013 года и 10 января 2013 года. Я хочу индекс 6 января 2013 года.

Надеюсь, это имеет смысл. Спасибо за помощь.

ОБНОВИТЬ:

Я стараюсь:

NSTimeInterval interval = 0; NSUInteger indexOfDate; for (NSDate * date in m_arEventsSorted) { if(abs([date timeIntervalSinceDate:[NSDate date]]) < interval) { interval = abs([date timeIntervalSinceDate:[NSDate date]]); indexOfDate = [m_arEventsSorted indexOfObject:date]; } } 

NSDate предоставляет метод timeIntervalSinceNow ( reference ), который возвращает NSTimeInterval ( typedef 'd double ). Просто используйте функцию fabs() чтобы найти самую маленькую разницу между каждой датой и сейчас .

Я бы рекомендовал функцию timeIntervalSinceDate:. Что-то вроде этого (код не проверен!):

 NSDate *currentDate = [NSDate date]; double min = [currentDate timeIntervalSinceDate:[array objectAtIndex:0]]; int minIndex = 0; for (int i = 1; i < [array count]; ++i) { double currentmin = [currentDate timeIntervalSinceDate:[array objectAtIndex:i]]; if (currentmin < min) { min = currentmin; minIndex = i; } } 

Вы можете получить самый близкий индекс от minIndex.

Это должно работать:

 NSDate *closestDate; for( NSDate *tempDate in dates ){ NSInteger tempDateInterval = [tempDate timeIntervalSinceNow]; //to work with positive and negative time difference if( tempDateInterval < 0 ){ tempDateInterval *= -1; } NSInteger closestDateInterval = [closestDate timeIntervalSinceNow]; if( closestDateInterval < 0 ){ closestDateInterval *= -1; } if( tempDateInterval < closestDateInterval ){ closestDate = tempDate; } } 

Я уверен, что есть много способов скинуть кошку, но мой личный любимый механизм скиннинга – преобразовать дату в эпоху, чтобы вы знали, что сравниваете апельсины с апельсинами и просто сравниваете даты как секунды. Это также устраняет проблему с часовыми поясами.

Если вам нужно убедиться, что вы выбираете ближайшее время до даты, вам может потребоваться проверить дату со временем 00:00:01 и 23:59:59 и использовать наименьший результат.

использование

 long secondsToDate = [date timeIntervalSince1970]; 

основанный на ответе Роланда Keesom, вот как это сработало для меня:

  NSDate *currentDate = [[objects objectAtIndex:0] valueForKey:@"date"]; int minIndex = 0; for (int i = 1; i < [objects count]; ++i) { NSDate *tempDate = [[objects objectAtIndex:i] valueForKey:@"date"]; NSInteger tempDateInterval = [tempDate timeIntervalSinceNow]; if (tempDateInterval < 0) tempDateInterval *= -1; NSInteger closestDateInterval = [currentDate timeIntervalSinceNow]; if (closestDateInterval < 0) closestDateInterval *= -1; if( tempDateInterval < closestDateInterval ){ currentDate = tempDate; minIndex = i; } } 

minIndex возвращает индекс ближайшей даты на сегодняшний день в массиве objects .

  • Когда мне нужно вызвать setNeedsDisplay в iOS?
  • Передайте аргумент для выбора
  • PresentViewController без полноэкранного режима
  • Как открыть многозадачную панель iOS в iOS iPad Simulator
  • iOS: отклонение и представление ModalViewController без доступа к его родительскому ViewController
  • UIActivityView прикрепить файл к электронной почте
  • Зачем добавлять myitlements.plist в мой проект?
  • CGContextClearRect с кругом
  • Мое приложение разбилось на iPad раньше, чем приложение: didFinishLaunchingWithOptions:
  • Как захватить данные QR-кода в определенной области AVCaptureVideoPreviewLayer с помощью Swift?
  • Атрибуты веб-формы iOS
  • Давайте будем гением компьютера.