NSPredicate filtered by year moth day

后端 未结 2 1849
攒了一身酷
攒了一身酷 2020-12-09 21:07

I use Core Data for storing my data model objects. Each object has NSDate property.

NSDate property has format like below:

2013-03-18 12:50:31 +0000
         


        
相关标签:
2条回答
  • 2020-12-09 21:07

    While David showed how you can create a predicate, i want to add a easier way to generate a date for 0:00

    NSDate *startDate = [NSDate date];
    NSTimeInterval lengthDay;
    
    [[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit 
                                    startDate:&startDate
                                     interval:&lengthDay 
                                      forDate:startDate];
    

    startDate now contain a date representing 0:00 for the current time zone of today

    NSDate *endDate = [startDate dateByAddingTimeInterval:lengthDay];
    

    Now we can put it into the predicate

    NSPredicate *daySpanPredicate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date < %@)", startDate, endDate];
    

    Thanks to MartinR for the improvement.

    0 讨论(0)
  • 2020-12-09 21:22

    If your dates are stored as actual dates then you should use that to your advantage and not fiddle with formats. You can simply create a predicate that checks that if the dates is between two dates (with times). The first date is your date with the time 00:00:00 and the second date is one day after that.

    // Create your date (without the time)
    NSDateComponents *yourDate = [NSDateComponents new];
    yourDate.calendar = [NSCalendar currentCalendar];
    yourDate.year  = 2013;
    yourDate.month = 3;
    yourDate.day   = 18;
    NSDate *startDate = [yourDate date];
    
    // Add one day to the previous date. Note that  1 day != 24 h
    NSDateComponents *oneDay = [NSDateComponents new];
    oneDay.day = 1;
    // one day after begin date
    NSDate *endDate = [[NSCalendar currentCalendar] dateByAddingComponents:oneDay 
                                                                    toDate:startDate
                                                                   options:0];
    
    // Predicate for all dates between startDate and endDate
    NSPredicate *dateThatAreOnThatDay = 
        [NSPredicate predicateWithFormat:@"(date >= %@) AND (date < %@)", 
                                         startDate, 
                                         endDate]];
    
    0 讨论(0)
提交回复
热议问题