Получить все NSDates МЕЖДУ startDate и endDate - PullRequest
6 голосов
/ 26 июня 2010

У меня вопрос ОБРАТНЫЙ к типичному «Как мне узнать, находится ли NSDate между startDate и endDate?»

Что я хочу сделать, это найти ВСЕ NSDATES (в день, а не в час или минуту), которые происходят между startDate и endDate. Включение этих дат было бы предпочтительным, хотя и не обязательным.

Пример: (Я знаю, что они не представляют NSDates, они только для иллюстрации)

ВХОД: startDate = 23.06.10 20:11:30 endDate = 27.06.10 02: 15: 00

ВЫВОД: NSArray of: 6/23/10, 6/24/10, 6/25/10, 6/26/10, 6/27/10

Я не против сделать работу. Просто я не знаю, с чего начать с точки зрения создания эффективного кода, без необходимости шаг за шагом проходить NSDates.

Ответы [ 3 ]

9 голосов
/ 26 июня 2010

Используйте экземпляр NSCalendar для преобразования вашего начального NSDate экземпляра в экземпляр NSDateComponents, добавьте 1 день к NSDateComponents и используйте NSCalendar для преобразования этого обратно в экземпляр NSDate.Повторяйте последние два шага, пока не достигнете конечной даты.

5 голосов
/ 26 июня 2010

Добавьте 24 часа к дате начала, пока вы не пройдете мимо даты окончания.

for ( nextDate = startDate ; [nextDate compare:endDate] < 0 ; nextDate = [nextDate addTimeInterval:24*60*60] ) {
  // use date
}

Вы можете округлить первую дату до полудня или полуночи до начала цикла, если вам небезразлично время суток.

2 голосов
/ 31 августа 2015

Начиная с OS X 10.9 и iOS 8.0, существует следующий очень чистый способ сделать это.Он также касается переходов на конец месяца.

let cal = NSCalendar.currentCalendar()
let start = NSDate()
let end = // some end date

var next = start
while !cal.isDate(next, inSameDayAsDate: end) {
    next = cal.dateByAddingUnit(.Day, value: 1, toDate: next, options: [])!
    // do something with `next`
}

Обратите внимание, что для более старых версий ОС -isDate:inSameDayAsDate: можно заменить некоторым вызовом, например, -components:fromDate:toDate:options: и -dateByAddingUnit:value:toDate:options: можно заменить на dateByAddingComponents:toDate:options:.

...