有什么办法使用星期几的谓词来过滤日期数组?

时间:2018-11-01 05:13:13

标签: ios nsdate nspredicate

我有一个数组,其中包含具有NSDate属性的自定义对象。我想以某种方式获取所有NSDate在星期日,星期一,星期二等的对象。

我觉得使用谓词是不可能的,但是希望我是错的,希望有一种方法不必遍历所有对象,获取日期,使用日期格式化程序将它们转换然后确定日期。

2 个答案:

答案 0 :(得分:1)

我认为谓词代码的块方法将更可行。

这是我的代码

    NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(Object * _Nullable evaluatedObject, NSDictionary<NSString *,id> * _Nullable bindings) {

    NSCalendar* cal = [NSCalendar currentCalendar];
    NSDateComponents* comp = [cal components:NSCalendarUnitWeekday fromDate:evaluatedObject.mDate];
    NSInteger weekDay = [comp weekday]; // 1 = Sunday, 2 = Monday, etc.

    return weekDay == 4;
}];

NSArray *arrFilteredObject = [arrData filteredArrayUsingPredicate:pred];

这里Object是我的自定义对象类,其中包含两个字段,即一个NSString和一个NSDate属性。

这是我的Object类供您参考

@interface Object : NSObject

@property (nonatomic, strong) NSString *title;
@property (nonatomic, strong) NSDate *mDate;

@end

希望有帮助。如果您在使用此方法时遇到任何问题,请告诉我。

答案 1 :(得分:0)

我能够弄清楚这一点。我确信,这是我在Objective-C中采用的方法,我确信它也可以轻松地快速适应。

实际上,我有一个自定义对象数组,每个对象都有一个NSDate属性,我需要在一周的某天对其进行过滤。

我通过向自定义对象添加另一个自定义getter实现了解决方案:

接口:

@property (nonatomic, retain, getter = dayOfWeek) NSString *dayOfWeek;

实施:

-(NSString*)dayOfWeek{
    return [[(AppDelegate*)[[UIApplication sharedApplication] delegate] dayOfWeekFormatter] stringFromDate:self.createdAt];
}

dayOfWeekFormatter是我在AppDelegate中创建的NSDateFormatter,可重复使用而不是每次都重新创建它:

@property (strong, nonatomic) NSDateFormatter *dayOfWeekFormatter;

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];

    self.dayOfWeekFormatter = [NSDateFormatter new];
    [self.dayOfWeekFormatter setDateFormat:@"eeee"];
    [self.dayOfWeekFormatter setLocale:locale];

您必须设置区域设置!

现在,我可以使用此谓词过滤所需的任何一天。以下是在星期三对所有对象进行过滤的示例:

NSArray *dayArray = [myTestArrayOfObjects filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"dayOfWeek == 'Wednesday'"]];