我的问题是典型的“我怎样才能知道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。
答案 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:
。