如何检查两个其他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,则执行同样的操作。如果beginDate
在beginDate
之前,则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 } }