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


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];

...

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

Question

لدي نموذج البيانات الأساسية مع خاصية 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