Создать диапазон дат - PullRequest
5 голосов
/ 11 марта 2012

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

Например, у меня есть начальная дата с 1 января 2012 года и конечная дата с 7 января 2012 года. Массив или диапазон должны содержать коллекцию объектов NSDate (всего 7).

Как мне это сделать?

Ответы [ 3 ]

7 голосов
/ 11 марта 2012

NSCalendar полезен здесь, так как он знает календарь, связанный с датами. Таким образом, используя следующее (при условии, что у вас есть startDate и endData и что вы хотите включить оба в список), вы можете перебирать даты, добавляя один день (NSCalendar позаботится о переносе месяцев и високосного года и т. Д. ).

NSMutableArray *dateList = [NSMutableArray array];
NSCalendar *currentCalendar = [NSCalendar currentCalendar];
NSDateComponents *comps = [[NSDateComponents alloc] init];
[comps setDay:1];

[dateList addObject: startDate];
NSDate *currentDate = startDate;
// add one the first time through, so that we can use NSOrderedAscending (prevents millisecond infinite loop)
currentDate = [currentCalendar dateByAddingComponents:comps toDate:currentDate  options:0];
while ( [endDate compare: currentDate] != NSOrderedAscending) {
    [dateList addObject: currentDate];
    currentDate = [currentCalendar dateByAddingComponents:comps toDate:currentDate  options:0];
}

[comps release];        
1 голос
/ 11 марта 2012

Просто создайте их и добавьте в массив ...

NSMutableArray *arr = [NSMutableArray array];
NSDateComponents *comps = [[[NSDateComponents alloc] init] autorelease];
[comps setMonth:1];
[comps setYear:2012];

for(int i=1;i<=7;i++) {
    [comps setDay:i];
    [arr addObject:[[NSCalendar currentCalendar] dateFromComponents:comps]];
}
0 голосов
/ 06 июля 2016

Из Apple doc: чтобы вычислить последовательность дат, используйте enumerateDatesStartingAfterDate: MatchComponents: options: usingBlock: метод вместо вызова этого метода (- nextDateAfterDate: MatchingComponents: options:) в цикле с результатом итерации предыдущего цикла.1001 *

Как я понял, он будет повторять все даты, соответствующие «matchComponents», до тех пор, пока вы не закончите итерацию с «stop.memory = true»

let calendar = NSCalendar.currentCalendar()
let startDate = calendar.startOfDayForDate(NSDate())
let finishDate = calendar.dateByAddingUnit(.Day, value: 10, toDate: startDate, options: [])
let dayComponent = NSDateComponents()
dayComponent.hour = 1

calendar.enumerateDatesStartingAfterDate(startDate, matchingComponents: dayComponent, options: [.MatchStrictly]) { (date, exactMatch, stop) in
    print(date)
    if date!.compare(finishDate!) == NSComparisonResult.OrderedDescending {
        // .memory gets at the value of an UnsafeMutablePointer
        stop.memory = true
    }
}
...