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

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)

  • 优秀!我从这里做了一个类别:` - (BOOL)isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate;` (4认同)
  • 这看起来不错,但您可能希望将其重命名为:+(BOOL)date:(NSDate*)date isBetweenDate:(NSDate*)beginDate andDate:(NSDate*)endDate以避免混淆. (3认同)
  • 代码高尔夫!编译器应该使比较短路,使效率大致等于你的效率:return(([date compare:beginDate]!= NSOrderedDescending)&&([date compare:endDate]!= NSOrderedAscending)); (3认同)
  • 很好的解决方案,您甚至可以通过短路(以及基本的De Morgan应用程序)来减少冗长(`return!([date compare:startDate] == NSOrderedAscending || [date compare:endDate] == NSOrderedDescending);` (2认同)

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,具有空格).

这是作为建设性的输入,因为当程序员理解他们的特定编程语言评估逻辑表达式的方式时,他们可以更有效地构建它们而不需要太多关于效率.然而,也有类似的测试,是低效率的,因为并不是所有的运营商短路.(实际上,大多数都不能短路,例如数值比较运算符.)如果有疑问,明确分解逻辑总是安全的,但是当你让语言/编译器处理小事时,代码可以更加可读为了你.


Chi*_*buZ 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)