如何检查两个其他NSDate之间是否发生NSDate

我试图找出当前date是否在使用NSDate的date范围内。

例如,您可以使用NSDate获取当前date/时间:

NSDate rightNow = [NSDate date]; 

然后我想用这个date来检查它是否在9AM – 5PM的范围内。

我想出了一个解决scheme。 如果您有更好的解决scheme,请随时离开,我会将其标记为正确的。

 + (BOOL)date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate { if ([date compare:beginDate] == NSOrderedAscending) return NO; if ([date compare:endDate] == NSOrderedDescending) return NO; return YES; } 

对于第一部分,使用@kperryua的答案来构build您想要比较的NSDate对象。 从你的答案到你自己的问题,这听起来像你有这个想法。

对于实际比较date,我完全同意@Tim对你的回答的评论。 它更简洁,但实际上完全等价于您的代码,我将解释原因。

 + (BOOL) date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate { return (([date compare:beginDate] != NSOrderedAscending) && ([date compare:endDate] != NSOrderedDescending)); } 

虽然看起来return语句必须评估&&操作符的两个操作数,但实际上并非如此。 关键是“ 短路评估 ”,这是用各种各样的编程语言实现的,当然在C中。基本上,如果第一个参数是0(或NO,nil等等),操作符&&& “短路” 。),而||| 如果第一个参数不是 0,则执行同样的操作。如果beginDatebeginDate之前,则testing返回NO ,甚至不需要与endDate进行比较。 基本上,它和你的代码做同样的事情,但是在一行中的单个语句中,不是5(或者7,带有空格)。

这是作为build设性的input,因为当程序员理解他们特定的编程语言评估逻辑expression式的方式时,他们可以更有效地构build它们,而不需要太多的效率。 但是,也有类似的testing效率不高,因为不是所有的运营商都会短路。 (事实上​​,大多数不能短路,比如数值比较运算符)。如果有疑问,在分解逻辑时总是明确的,但是当让语言/编译器处理小事情时,代码可读性更高为你。

布鲁克·伍尔夫版Swift:

 extension NSDate { func isBetweenDates(beginDate: NSDate, endDate: NSDate) -> Bool { if self.compare(beginDate) == .OrderedAscending { return false } if self.compare(endDate) == .OrderedDescending { return false } return true } } 

如果您想知道当前date是否在两个给定时间点(2009年7月1日上午9点至下午5点)之间,请使用NSCalendar和NSDateComponents构build所需时间的NSDate实例,并将其与当前date进行比较。

如果您想知道当前date是否在这两个小时之间,那么您可以换个方式。 使用NSCalendar和NSDate创build一个NSDateComponents对象,并比较小时组件。

这可以使用date的时间间隔轻松完成,如下所示:

 const NSTimeInterval i = [date timeIntervalSinceReferenceDate]; return ([startDate timeIntervalSinceReferenceDate] <= i && [endDate timeIntervalSinceReferenceDate] >= i); 

继续使用Quinn和Brock的解决scheme,NSDate实现的子类是非常好的,所以可以像这样在任何地方使用它:

 -(BOOL) isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate { return (([self compare:beginDate] != NSOrderedAscending) && ([self compare:endDate] != NSOrderedDescending)); } 

在你的代码的任何部分,你可以使用它:

 [myNSDate isBetweenDate:thisNSDate andDate:thatNSDate]; 

(myNSDate,thisNSDate和thatNSDate当然NSDates 🙂

Swift中更好的版本:

 @objc public class DateRange: NSObject { let startDate: Date let endDate: Date init(startDate: Date, endDate: Date) { self.startDate = startDate self.endDate = endDate } @objc(containsDate:) func contains(_ date: Date) -> Bool { let startDateOrder = date.compare(startDate) let endDateOrder = date.compare(endDate) let validStartDate = startDateOrder == .orderedAscending || startDateOrder == .orderedSame let validEndDate = endDateOrder == .orderedDescending || endDateOrder == .orderedSame return validStartDate && validEndDate } }