事实上,有!这是一种迂回的做法,因为NSPredicate
不直接支持它(即,你不能只是+ anInterval
to an NSDate
)。幸运的是,你可以做到,而且幸运的是,我大约两天前才想出来。
澄清一下:我假设你要求的是这样的东西:“一个对象有一个date
财产。我想看看这个是否date
属性是另一个日期之前/之后的某个任意间隔”。如果这就是您的意思,那么是的,您可以做到这一点。如果这不是您的意思,那么请澄清您的问题。
开始了。在这个例子中,我们将假设我们将评估这个谓词的对象有一个名为的属性date
返回一个NSDate
。我们将查看此日期是否比另一个日期至少早 1 天。我们可以通过几种不同的方式进行比较:
date + 1 day is before comparisonDate
date is before comparisonDate - 1 day
我将采用第一种方法:
NSDate * comparisonDate = ...; //an arbitrary NSDate object, against which we're going to be doing our comparison
NSTimeInterval interval = 86400; //the number of seconds you want add or subtract.
NSPredicate * p = [NSPredicate predicateWithFormat:@"CAST(CAST(date, 'NSNumber') + %f, 'NSDate') < %@", interval, comparisonDate];
这是怎么回事:
为了让它发挥作用,我们可以CAST()
日期对象到NSNumber
。这将转换NSDate
进入一个NSNumber
这是距离参考时间点(例如 1970 年 1 月 1 日或其他)的一些秒数。我们对这个数字加上或减去我们的间隔,然后将新数字转换回一个NSDate
。然后我们可以使用常规比较运算符将新日期与比较日期进行比较。
这个想法有几个不同的变体,但它们都需要铸造一个NSDate
到一个数字(或将一个数字转换为NSDate
) 来获取其时间间隔。
狡猾的,嗯?
edit
如果 Core Data 抱怨谓词的构造,请尝试反转事情:
NSDate * comparisonDate = ...;
NSTimeInterval interval = 86400;
NSPredicate * p = [NSPredicate predicateWithFormat:@"date < CAST(CAST(%@, 'NSNumber') - %f, 'NSDate')", comparisonDate, interval];
edit #2
牧师偷走的雷霆:http://tumblr.com/xqorqjfrz