创建一系列日期

时间:2012-03-10 23:52:31

标签: objective-c nsdate foundation

我想创建一个范围数组,其中包含特定开始日期和结束日期之间的天数。

例如,我的开始日期为2012年1月1日,结束日期为2012年1月7日。数组或范围应包含NSDate对象的集合(总共7个)。

我该怎么做?

3 个答案:

答案 0 :(得分:7)

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 :(得分:1)

只需创建它们并将它们添加到数组中......

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]];
}

答案 2 :(得分:0)

来自Apple doc: 要计算日期序列,请使用enumerateDatesStartingAfterDate:matchingComponents:options:usingBlock:方法而不是调用此方法( - nextDateAfterDate:matchingComponents:options: )在循环中使用前一个循环迭代的结果。

当我得到它时,它将迭代与“matchingComponents”匹配的所有日期,直到你用“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
    }
}