Bro*_*olf 90 cocoa datetime cocoa-touch objective-c nsdate
我试图使用NSDate判断当前日期是否在日期范围内.
例如,您可以使用NSDate获取当前日期/时间:
NSDate rightNow = [NSDate date];
Run Code Online (Sandbox Code Playgroud)
然后我想用那个日期来检查它是否在上午9点到下午5点之间.
Bro*_*olf 164
我想出了一个解决方案.如果您有更好的解决方案,请随意离开,我会将其标记为正确.
+ (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;
}
Run Code Online (Sandbox Code Playgroud)
Qui*_*lor 13
对于第一部分,使用@kperryua中的答案来构造要与之比较的NSDate对象.根据你对自己问题的回答,听起来你已经弄明白了.
为了实际比较日期,我完全赞同@Tim对你答案的评论.它更简洁但实际上完全等同于您的代码,我将解释原因.
+ (BOOL) date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate {
return (([date compare:beginDate] != NSOrderedAscending) && ([date compare:endDate] != NSOrderedDescending));
}
Run Code Online (Sandbox Code Playgroud)
虽然看起来return语句必须评估&&运算符的两个操作数,但事实并非如此.关键是" 短路评估 ",它以各种各样的编程语言实现,当然在C中实现.基本上,如果第一个参数为0(或NO,nil等),操作符&和&&"短路" ,而|并||做相同的,如果第一个参数是不是 0.如果date到来之前beginDate,测试的回报NO,甚至无需与比较endDate.基本上,它与您的代码完全相同,但在一行中的单个语句中,而不是5(或7,具有空格).
这是作为建设性的输入,因为当程序员理解他们的特定编程语言评估逻辑表达式的方式时,他们可以更有效地构建它们而不需要太多关于效率.然而,也有类似的测试,将是低效率的,因为并不是所有的运营商短路.(实际上,大多数都不能短路,例如数值比较运算符.)如果有疑问,明确分解逻辑总是安全的,但是当你让语言/编译器处理小事时,代码可以更加可读为了你.
Swift中的Brock Woolf版本:
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
}
}
Run Code Online (Sandbox Code Playgroud)