我想创建一个范围数组,其中包含特定开始日期和结束日期之间的天数。
例如,我的开始日期为2012年1月1日,结束日期为2012年1月7日。数组或范围应包含NSDate对象的集合(总共7个)。
我该怎么做?
答案 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
}
}