对日期数组进行排序以提取每个星期日

时间:2014-10-28 09:12:06

标签: ios iphone nsdateformatter nsdatecomponents

我是ios的新手,我想知道如何从NSMutableArray的日期(作为字符串)提取该数组中的所有星期日。

从我的研究到目前为止,我发现我必须从今天开始,就像这样

NSDate *now = [NSDate date];
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

然后"选择"这样的星期天

NSDateComponents *dateComponents = [calendar components:NSWeekdayCalendarUnit |       NSHourCalendarUnit fromDate:now];    
NSInteger weekday = [dateComponents 1]; // 1 is sunday right ?! 

然后回到过去,每个星期天都把日期放在一个新的数组中。

   NSDate *dateRelease;
   NSDateFormatter *dateFormatter = [ [ NSDateFormatter alloc ] init ];
   [ dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"] ];
   [ dateFormatter setDateFormat:@"yyyy-MM-dd" ];

   for (int i = [ dateFormatter dateFromString:[[[[DessinsManager sharedInstance]imagesList].count ; i > 0; i--){

     dateRelease = [ dateFormatter dateFromString:[[[[DessinsManager sharedInstance]imagesList] objectAtIndex:i]dateDrawing] ];

     //Check for the sundays here 
     if ( [now compare: dateRelease] == NSOrderedDescending  ) {
     //if sundays put in new array
     } else {
     //if not sundays then go on with loop
     }   
   }

为此,我对如何进行比较以获得星期日(我的阵列从2013年11月1日到今天)感到有点困惑......

感谢您的帮助

V.v

2 个答案:

答案 0 :(得分:0)

您应该使用- (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate方法,该方法返回一个新数组,用谓词评估原始对象中的每个对象。

这样的谓词可以使用+ (NSPredicate *)predicateWithBlock:(BOOL (^)(id evaluatedObject, NSDictionary *bindings))block构建,也可能来自Dave DeLong's answer here的一些灵感来识别被评估的日子。

答案 1 :(得分:0)

首先将日期存储为NSDate个对象,因为您应始终使用最合适的数据类型存储数据:

NSArray *datesAsStrings = ...;
NSMutableArray *dates = [NSMutableArray new];
NSDateFormatter *dateFormatter = [NSDateFormatter new];
dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
dateFormatter.dateFormat = @"yyyy-MM-dd";
for (NSString *dateStr in datesAsStrings) {
    NSDate *date = [dateFormatter dateFromString:dateStr];
    [dates addObject:dates];
}

然后过滤掉星期日:

NSMutableArray *sundays = [NSMutableArray new];
[dates enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop)) {
    NSDate *date = (NSDate *)obj;
    NSCalendar *calendar = [NSCalendar currentCalendar];
    NSDateComponents *comps = [calendar components:NSWeekdayCalendarUnit
                                          fromDate:date];
    if (comps.weekday == 1)
        [sundays addObject:date];
}];