На самом деле, есть! Это окольный способ сделать это, потому что NSPredicate
не поддерживает его напрямую (то есть вы не можете просто + anInterval
до NSDate
). К счастью, вы можете сделать это, и к счастью для вас, я только что понял это около 2 дней назад.
Чтобы уточнить: я предполагаю, что вы спрашиваете что-то вроде: "объект имеет свойство 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
, который некоторое количество секунд от контрольной точки во времени (например, 1 Jan 1970 или любой другой). К этому числу мы добавляем или вычитаем наш интервал, а затем приводим новый номер обратно к NSDate
. Затем мы можем использовать обычный оператор сравнения для сравнения нашей новой даты с нашей датой сравнения.
Есть несколько вариантов этой идеи, но все они требуют приведения числа NSDate
к числу (или числа к NSDate
), чтобы получить его временной интервал.
Коварный, а?
редактировать
Если 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