Основные данные - предикат с датами - PullRequest
10 голосов
/ 25 июля 2011

Я в тупике, пытаясь написать предикат для задач «Недавно завершено», то есть показать задачу, если она была выполнена в течение последних 7 дней.Я думаю, что мне нужно сделать что-то вроде этого: «если СЕЙЧАС

dateCompleted является атрибутом таблицы, но я не уверен, каким образом я должен получить его значение и добавить к нему 7 дней из предиката.Я думаю, мне нужно получить значение атрибута, прежде чем писать NSPredicate, но как?У меня нет доступа к управляемому объекту на данный момент.

Это может быть близким решением, но я не могу понять, как определить 'oneWeek', и я не думаю, что вы можете просто добавить значения при определении предиката:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"%@ < todoCompletedDate + %@", [NSDate date], oneWeek];

Ответы [ 3 ]

18 голосов
/ 25 июля 2011

Ты почти у цели.

Во-первых, вам нужно определить диапазон дат. Для этого вам нужно начать с сегодняшней даты, а затем добавить несколько недель, чтобы найти конец допустимого диапазона. Когда у вас есть этот диапазон, вы можете построить свой предикат, чтобы найти все задачи со сроком исполнения> = начало и <= конец. Вот выдержка из некоторого кода, который я написал для чего-то очень похожего ... </p>

NSDate *today = [NSDate date];
NSDate *startOfToday = [DateHelper startOfDay:today];
NSDate *endOfWeek = [DateHelper addDaysToDate:today daysToAdd:6];
return [NSPredicate predicateWithFormat:@"(dueDate >= %@) AND (dueDate <= %@) AND complete == 0", startOfToday, endOfWeek];
0 голосов
/ 21 марта 2017

Чтобы получить за неделю до данных за сегодня. Свифт код

let calendar = NSCalendar.currentCalendar()
let now = NSDate()
let nowTimeStamp = self.getCurrentTimeStampWOMiliseconds(now)

let sevenDaysAgo = calendar.dateByAddingUnit(.Day, value: -7, toDate: now, options: [])!
let startDate = calendar.startOfDayForDate(sevenDaysAgo)
let startDateTimeStamp = self.getCurrentTimeStampWOMiliseconds(startDate)

let predicate1 = NSPredicate(format:"(iCreatedAt >= %@) AND (iCreatedAt < %@) AND location = %@", startDateTimeStamp, nowTimeStamp)

В моем случае у меня есть значение метки времени post в моей базе данных coreData, поэтому я использую функцию ниже также, чтобы получить значение метки времени

 func getCurrentTimeStampWOMiliseconds(dateToConvert: NSDate) -> String {
        let objDateformat: NSDateFormatter = NSDateFormatter()
        objDateformat.dateFormat = "yyyy-MM-dd HH:mm:ss"
        let strTime: String = objDateformat.stringFromDate(dateToConvert)
        let objUTCDate: NSDate = objDateformat.dateFromString(strTime)!
        let milliseconds: Int64 = Int64(objUTCDate.timeIntervalSince1970)
        let strTimeStamp: String = "\(milliseconds)"
        return strTimeStamp
    }
0 голосов
/ 04 февраля 2015

Для начала дня вы можете использовать:

NSDate *date = [NSDate date];
NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *dateComponents = [gregorianCalendar components:(NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear) fromDate:date];
NSDate *startDate = [gregorianCalendar dateFromComponents:dateComponents];

и получить дату окончания:

NSCalendar* gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents* dateComponents = [gregorianCalendar components:(NSCalendarUnitDay | NSCalendarUnitMonth | NSCalendarUnitYear) fromDate:date];
[dateComponents setHour:23];
[dateComponents setMinute:59];
[dateComponents setSecond:59];
[dateComponents setDay:[dateComponents day]+7];
NSDate *endDate = [gregorianCalendar dateFromComponents:dateComponents];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...