2010-06-26 40 views
6

我的问题是典型的“如何找出NSDate是否介于startDate和endDate之间?”的倒退?获取所有NSDates BETWEEN startDate和endDate

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

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

INPUT: 的startDate = 10-6-23 20点11分30秒结束日期 =27分之6/ 10二点15分00秒

OUTPUT: 的NSArray的:10-6-23,10年6月24日,10年6月25日,10年6月26日,10年6月27日

我不介意做这项工作。只是我不知道从高效的代码开始在哪里开始,而不必逐步地逐步浏览NSDate。

回答

5

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

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

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

+2

我使用“timeIntervalSinceDate:”而不是“比较:”,因为timeIntervalSinceDate返回一个数值,尽管比较也可以。此外,“timeIntervalSinceDate”已弃用,所以我使用“dateByAddingTimeInterval:” 我想过做这样的事情,但不知道我可以像这样格式化循环。谢谢! – 2010-06-26 21:40:22

+0

addTimeInterval:自iOS 4以后不推荐使用。 – 2014-07-30 21:03:05

+0

由于夏令时时间的不同,天数有不同的小时数。 – 2014-11-08 17:43:52

9

使用一个NSCalendar实例你开始NSDate实例转换为NSDateComponents情况下,每天1次添加到NSDateComponents和使用NSCalendar将其转换回一个NSDate实例。重复最后两个步骤,直到到达结束日期。

+0

这也适用,但比drawnonward的解决方案有点混乱。 – 2010-06-26 21:38:04

+4

Messier?不。更正确?是。 Drawnonward的解决方案没有考虑到由于日历特性(如夏令时等)可能弹出的任何问题。使用'NSCalendar'肯定是Apple推荐的方式。 – 2010-06-26 22:25:17

+0

NSCalendar在连续的日子里过度杀毒。中午的开始日期涵盖夏令时。事实上,24小时内可能是第二次关闭的事实,直到你重复30000次闰秒并且只有24次才是重要的。闰日是24小时。使用NSCalendar将不必要的复杂化添加到一个简单的任务。 – drawnonward 2010-06-27 00:45:00

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:

相关问题