objective-c - NSPredicate: تصفية الكائنات حسب يوم خاصية NSDate




4 Answers

مثال على كيفية إعداد startDate و endDate للإجابة المذكورة أعلاه:

...

NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit ) fromDate:[NSDate date]];
//create a date with these components
NSDate *startDate = [calendar dateFromComponents:components];
[components setMonth:1];
[components setDay:0]; //reset the other components
[components setYear:0]; //reset the other components
NSDate *endDate = [calendar dateByAddingComponents:components toDate:startDate options:0];
predicate = [NSPredicate predicateWithFormat:@"((date >= %@) AND (date < %@)) || (date = nil)",startDate,endDate];

...

هنا كنت أبحث عن جميع الإدخالات في غضون شهر واحد. تجدر الإشارة إلى أن هذا المثال يوضح أيضًا كيفية البحث عن تاريخ "لا شيء".

objective-c core-data nsdate nspredicate nsfetchedresultscontroller

لدي نموذج البيانات الأساسية مع خاصية NSDate . أريد تصفية قاعدة البيانات حسب اليوم. أفترض أن الحل سيشمل NSPredicate ، لكنني لست متأكدًا من كيفية وضع كل ذلك معًا.

أعرف كيفية مقارنة يوم اثنين من NSDateComponents باستخدام NSDateComponents و NSCalendar ، ولكن كيف يمكنني NSPredicate مع NSPredicate ؟

ربما أحتاج إلى إنشاء فئة في الفئة الفرعية NSManagedObject والتي يمكنها إرجاع التاريخ العاري مع العام والشهر واليوم فقط. ثم يمكنني مقارنة ذلك في NSPredicate . هل هذه توصيتك أم أن هناك شيئًا أكثر بساطة؟




قمت بنقل الإجابة من جلاوكو نيفيس إلى سويفت 2.0 ولفتها داخل وظيفة تتلقى تاريخًا وتعيد NSPredicate لليوم المقابل:

func predicateForDayFromDate(date: NSDate) -> NSPredicate {
    let calendar = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian)
    let components = calendar!.components([.Year, .Month, .Day, .Hour, .Minute, .Second], fromDate: date)
    components.hour = 00
    components.minute = 00
    components.second = 00
    let startDate = calendar!.dateFromComponents(components)
    components.hour = 23
    components.minute = 59
    components.second = 59
    let endDate = calendar!.dateFromComponents(components)

    return NSPredicate(format: "day >= %@ AND day =< %@", argumentArray: [startDate!, endDate!])
}



امتداد Swift 3.0 للتاريخ:

extension Date{

func makeDayPredicate() -> NSPredicate {
    let calendar = Calendar.current
    var components = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: self)
    components.hour = 00
    components.minute = 00
    components.second = 00
    let startDate = calendar.date(from: components)
    components.hour = 23
    components.minute = 59
    components.second = 59
    let endDate = calendar.date(from: components)
    return NSPredicate(format: "day >= %@ AND day =< %@", argumentArray: [startDate!, endDate!])
}
}

ثم استخدم مثل:

 let fetchReq = NSFetchRequest(entityName: "MyObject")
 fetchReq.predicate = myDate.makeDayPredicate()



بالنسبة لي هذا هو عمل.

NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit ) fromDate:[NSDate date]];
    //create a date with these components
    NSDate *startDate = [calendar dateFromComponents:components];
    [components setMonth:0];
    [components setDay:0]; //reset the other components
    [components setYear:0]; //reset the other components
    NSDate *endDate = [calendar dateByAddingComponents:components toDate:startDate options:0];

    startDate = [NSDate date];
    endDate = [startDate dateByAddingTimeInterval:-(7 * 24 * 60 * 60)];//change here

    NSString *startTimeStamp = [[NSNumber numberWithInt:floor([endDate timeIntervalSince1970])] stringValue];
    NSString *endTimeStamp = [[NSNumber numberWithInt:floor([startDate timeIntervalSince1970])] stringValue];


   NSPredicate *predicate = [NSPredicate predicateWithFormat:@"((paidDate1 >= %@) AND (paidDate1 < %@))",startTimeStamp,endTimeStamp];
    NSLog(@"predicate is %@",predicate);
    totalArr = [completeArray filteredArrayUsingPredicate:predicate];
    [self filterAndPopulateDataBasedonIndex];
    [self.tableviewObj reloadData];
    NSLog(@"result is %@",totalArr);

لدي مجموعة مصفاة من التاريخ الحالي إلى 7 أيام إلى الخلف. أعني أن أحصل على بيانات أسبوع واحد من التاريخ الحالي. هذا يجب أن يعمل.

ملاحظة: أنا أقوم بتحويل التاريخ الذي يأتي مع الثواني من الألف من 1000 ، ومقارنة بعد. اسمحوا لي أن أعرف إذا كنت بحاجة إلى أي وضوح.




Related