获取所有NSDate BETWEEN startDate和endDate

时间:2010-06-26 18:30:30

标签: iphone objective-c nsdate

我的问题是典型的“我怎样才能知道NSDate是否在startDate和endDate之间?”

我想要做的是找到在startWate和endDate之间发生的所有NSDATES(到当天,而不是小时或分钟)。包括这些日期将是更可取的,尽管没有必要。

实施例: (我知道这些不代表NSDates,这些只是为了说明)

INPUT: startDate = 6/23/10 20:11:30 endDate = 6/27/10 02:15:00

输出: NSArray:6/23/10,6/24/10,6/25/10,6/26 / 10,6 / 27/10

我不介意做这项工作。只是我不知道从哪里开始制作有效的代码,而不必一点一点地逐步完成NSDates。

3 个答案:

答案 0 :(得分:9)

使用NSCalendar实例将您的开始NSDate实例转换为NSDateComponents实例,将{1}}添加1天并使用NSDateComponents进行转换回到NSCalendar实例。重复最后两个步骤,直至到达结束日期。

答案 1 :(得分:5)

将24小时添加到开始日期,直到超过结束日期。

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

如果你关心一天中的时间,你可以在开始循环之前将第一个日期转到中午或午夜。

答案 2 :(得分:2)

自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: